c++ - enable_if + std::less + sizeof... 的组合使 MSVC 失败
问题描述
这是一个非常简单的代码:
template <typename... Args,
typename std::enable_if<std::less<int>()(sizeof...(Args), 3), int>::type* = nullptr>
void test(std::tuple<Args...>)
{
}
int main()
{
test(std::make_tuple(1, 2));
}
它只是带有某些enable_if
条件的简单函数模板。(用于进一步的 SFINAE)。
但它无法在具有 C++ 17设置的Visual Studio 2019 中编译。
error C2672: 'test': no matching overloaded function found
error C2783: 'void test(std::tuple<_Types...>)': could not deduce template argument for '__formal'
但是我发现它在 GCC 和 Clang 中编译得很好。为什么看似无辜的代码会失败?
有趣的是,如果我代替它sizeof...(Args)
,2
它会突然起作用。
编辑:我最初的问题没有提供 type in enable_if
,但我发现void*
在 C++ 17 中不允许作为非类型模板参数。但这没关系。因为即使我更改为std::enable_if<std::less<int>()(sizeof...(Args), 3), int>
,它仍然会失败并出现相同的错误。
解决方案
template <class T = void> struct less { constexpr bool operator()(const T& x, const T& y) const; };
constexpr bool operator()(const T& x, const T& y) const;
回报:
x < y
。
运营商是constexpr
。因此,就您而言,您的代码很好less
。
但是,从技术上讲,MSVC 实际上就在这里——非类型模板参数void*
在 C++17 中不应该有类型。MSVC 实际上对此进行了诊断。无论如何,这纯属巧合。
您可以<
直接使用作为解决方法:
template <typename... Args,
typename std::enable_if<(sizeof...(Args) < 3), int>::type = 0>
void test(std::tuple<Args...>)
(请注意,int
用 代替void*
,因此语言学究绝对无话可说。)
推荐阅读
- mongodb - MongoDb 使用 ref 查询其他集合
- html - 该部分的背景图像到特定高度
- selenium-webdriver - IE11 Save As Popup 处理问题 WebDriver/Autoit/Robot
- python-3.x - 将无限列表解析为一个列表
- php - 缺少作者;谷歌网站管理员工具中缺少更新
- c# - 从属性中获取属性的名称
- c# - DataGridViewComboBoxColumn 中的选定项目始终检索第一个值
- android - Uri 和 WebView 类以不同方式解析包含权限(主机或用户信息)中的反斜杠的 URL
- python - 如何使用python从cloudformation堆栈字典中获取特定字段的值
- php - 如何使用 Yii2 kartik-mpdf 添加水印