Почему 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. Во всех остальных случаях значение равно false.

std::is_copy_constructible_v<int&> должен дать тот же результат, что и std::is_constructible_v<int&, const int&>; однако clang 7.0 дает другие результаты, как показано выше.

Соответствует ли это поведение стандартам C++?


person xmllmx    schedule 01.02.2019    source источник
comment
С другой стороны, using T = int&; static_assert(std::is_constructible_v<T, const T&>); // true по крайней мере соответствует результату is_copy_constructible_v.   -  person dewaffled    schedule 01.02.2019


Ответы (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

person P.W    schedule 01.02.2019