用于可变参数模板参数列表的带有std :: is_rvalue_reference的SFINAE失败

时间:2019-07-26 08:33:04

标签: sfinae rvalue-reference variadic

我尝试实现一个带有右值引用的变量列表的函数。看起来像这样:

Conv2DTranspose()

当我尝试这样称呼它时:

template <
    typename... Args,
    typename = std::enable_if_t<std::conjunction<
        std::is_rvalue_reference<Args>...>::value>
>
void myfunc(Args&&... args)
{ }

编译器告诉我他找不到该函数。如果我删除了SFINAE,请检查它是否有效。 我在这里错过了什么吗,还是编译器错误? 我正在使用Visual Studio和工具集v140和v141。

预先感谢, 马丁

1 个答案:

答案 0 :(得分:2)

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;
}