为什么std :: is_copy_constructible <t &&> :: value返回false?

时间:2015-06-28 23:32:32

标签: c++ templates c++11 language-lawyer

即使is_copy_constructible<T&&> false为相同类型is_copy_constructible<T>true似乎T。我用gcc和clang对此进行了测试,得到了相同的结果。这是预期的行为吗?标准在哪里定义了这个?这种行为的原因是什么?

使用错误"int&& doesn't work"编译的示例代码:

#include <type_traits>

int main() {
    static_assert(std::is_copy_constructible<int>::value, "int doesn't work");
    static_assert(std::is_copy_constructible<int&>::value, "int& doesn't work");
    static_assert(std::is_copy_constructible<int&&>::value, "int&& doesn't work");

    return 0;
}

当我尝试在模板参数上创建约束时,我遇到了这种情况,以确保模板仅适用于可复制构造类型。我是否需要为r值引用类型创建一个特殊情况,以便让我的模板使用r值引用来复制可构造类型?

1 个答案:

答案 0 :(得分:4)

is_copy_constructible<T>定义为is_constructible<T, const T&>。对于T = int &&,后者变为is_constructible<int&&, int&>,这显然是假的:

int & f();
int && r(f());   // ill-formed