#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 ++标准?
答案 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>::value
与std::is_constructible<T, const T&>::value
相同。
所以在您的情况下:
std::is_constructible<int, const int&>::value
与std::is_copy_constructible_v<int>
相同。
请参见DEMO