带有 std::is_rvalue_reference 的可变参数模板参数列表的 SFINAE 失败
SFINAE with std::is_rvalue_reference for variadic template argument list fails
我尝试实现一个采用右值引用变量列表的函数。它看起来像这样:
template <
typename... Args,
typename = std::enable_if_t<std::conjunction<
std::is_rvalue_reference<Args>...>::value>
>
void myfunc(Args&&... args)
{ }
当我尝试这样称呼它时:
void doit()
{
int x;
myfunc(std::move(x));
}
编译器告诉我他找不到函数。如果我删除 SFINAE 检查它是否有效。
我在这里错过了什么,还是编译器错了?
我将 Visual Studio 与工具集 v140 和 v141 一起使用。
提前致谢,
马丁
Args
不是右值引用,Args&&
是。
#include <type_traits>
#include <utility>
template <
typename... Args,
typename = std::enable_if_t<std::conjunction<
std::is_rvalue_reference<Args&&>...>::value>
>
void myfunc(Args&&... args) { }
struct probe {};
int main() {
probe x;
// this compiles
myfunc(std::move(x));
// this does not
myfunc(x);
return 0;
}
我尝试实现一个采用右值引用变量列表的函数。它看起来像这样:
template <
typename... Args,
typename = std::enable_if_t<std::conjunction<
std::is_rvalue_reference<Args>...>::value>
>
void myfunc(Args&&... args)
{ }
当我尝试这样称呼它时:
void doit()
{
int x;
myfunc(std::move(x));
}
编译器告诉我他找不到函数。如果我删除 SFINAE 检查它是否有效。 我在这里错过了什么,还是编译器错了? 我将 Visual Studio 与工具集 v140 和 v141 一起使用。
提前致谢, 马丁
Args
不是右值引用,Args&&
是。
#include <type_traits>
#include <utility>
template <
typename... Args,
typename = std::enable_if_t<std::conjunction<
std::is_rvalue_reference<Args&&>...>::value>
>
void myfunc(Args&&... args) { }
struct probe {};
int main() {
probe x;
// this compiles
myfunc(std::move(x));
// this does not
myfunc(x);
return 0;
}