c++ - enable_if + std::less + sizeof... 的组合使 MSVC 失败

标签 c++ visual-c++

这是一个非常简单的代码:

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)。

但是它无法在 Visual Studio 2019 with C++ 17 设置中编译

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然后它突然起作用了。

编辑:我原来的问题没有提供类型 enable_if ,但我发现 void*在 C++ 17 中不允许作为非类型模板参数。但这没关系。 因为即使我更改为 std::enable_if<std::less<int>()(sizeof...(Args), 3), int> , 它仍然失败并出现同样的错误。

最佳答案

根据 [comparisons.less] :

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;

Returns: 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* ,因此语言学究绝对无话可说。)

关于c++ - enable_if + std::less + sizeof... 的组合使 MSVC 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56880663/

相关文章:

c++ - 简单策略模式中的错误

c++ - 在没有代码重复的情况下将 C 函数包装在自动对象中

c++ - 在编译时为变量赋值

visual-c++ - 我如何分发 msvr71.dll (microsoft visual c++ runtime dll)

c++ - 蓝牙(未解析的外部符号)

c++ - 为什么变量不变?

c++ - 测试 AVX 寄存器是否包含一些相等的整数

visual-studio-2010 - c++ -- Visual Studio 2010 链接器错误 LNK1104 : 'cannot open file Debug\AssemblyInfo.obj' [. obj 文件未在编译时创建]

qt - 安装Qt 5.6.1 MSVC 2015 Update 3

c++ - 如何在 CRT 中模拟文件读取错误