【发布时间】:2019-07-04 04:30:15
【问题描述】:
这是一个非常简单的代码:
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>,它仍然会失败并出现同样的错误。
【问题讨论】:
-
为什么不直接
sizeof...(Args) < 3呢? ;-) -
请注意,
void*非类型模板参数在 C++17 中是不允许的。见stackoverflow.com/q/56003162 -
@L.F.哇,我不知道。但我认为 MSVC 仍然是错误的(或至少不一致),因为如果我将
sizeof更改为2,它就可以工作。 -
是的,这不过是两个错误导致的巧合正确。
-
It does work 如果将模板更改为匿名类型而不是非类型,很有趣。
标签: c++ visual-c++