Почему 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

Другие вопросы по тегам