Почему std::is_copy_constructible не работает должным образом?
#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. Во всех остальных случаях значение ложно.
std::is_copy_constructible_v<int&>
должен дать тот же результат, что и std::is_constructible_v<int&, const int&>
делает; тем не мение, clang 7.0
дает разные результаты, как показано выше.
Соответствует ли это поведение стандартам C++?
1 ответ
Что такое ссылка для состояний 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