#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++?
using T = int&; static_assert(std::is_constructible_v<T, const T&>); // true
по крайней мере соответствует результатуis_copy_constructible_v
. - person dewaffled   schedule 01.02.2019