为什么std :: is_copy_constructible的行为不符合预期?

时间:2019-02-01 07:19:36

标签: c++ c++11 standards typetraits compile-time-constant

#include <type_traits>

int main()
{
    std::is_constructible_v<int&, const int&>; // false, as expected.
    std::is_copy_constructible_v<int&>; // true, NOT as expected!
}

根据cppref

  

如果T是对象或引用类型,并且变量定义T   obj(std :: declval()...);格式正确,提供成员   常数等于true。在所有其他情况下,值均为false。

std::is_copy_constructible_v<int&>的结果应与std::is_constructible_v<int&, const int&>相同;但是,clang 7.0的结果如上所述。

此行为是否符合C ++标准?

1 个答案:

答案 0 :(得分:2)

is_copy_constructible状态的引用是:

  

如果T不是可引用的类型(即,可能是cv限定的void或具有cv-qualifier-seq或ref-qualifier的函数类型),则提供等于false的成员常量值。否则,请提供等于std::is_constructible<T, const T&>::value的成员常量值。

因此,这里is_copy_constructible<T>::valuestd::is_constructible<T, const T&>::value相同。

所以在您的情况下:

std::is_constructible<int, const int&>::valuestd::is_copy_constructible_v<int>相同。

请参见DEMO