Почему std :: is_copy_constructible не работает должным образом? - PullRequest
0 голосов
/ 01 февраля 2019
#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 голосов
/ 01 февраля 2019

Что такое ссылка для is_copy_constructible состояний:

Если T не является ссылочным типом (т. Е. Возможно cv-квалифицированным void или типом функции с cv-квалификатором)-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

...