Ответ 1
Согласен, спасибо за отчет об ошибке.
Обновить
Связанный вопрос: Какое ожидаемое значение:
std::is_constructible<int&>::value
? Это не совсем понятно для мне от чтения стандарта.
Что говорится в стандарте:
Для ссылочного типа
T
, тот же результат, что иis_constructible<T, const T&>::value
, иначеfalse
.
A "ссылочный тип" - это в основном ничего, кроме void
. Я перефразирую. Это не точное определение. Он должен быть понятным, а не точным. Языковой адвокат (включая меня) может разорвать его на части. Но для удобства понимания "все, кроме a void
" достаточно близко.
Итак, ваш вопрос становится, что есть:
std::is_constructible<int&, const (int&)&>::value // I've used pseudo code
const
, примененный к ссылкам, является no-op(). И ссылки lvalue, применяемые к lvalue-ссылкам, являются no-op (из-за списания ссылок). Например, рассмотрите этот не переносимый объект type_name
:
#include <type_traits>
#include <memory>
#include <iostream>
#include <cxxabi.h>
#include <cstdlib>
template <typename T>
std::string
type_name()
{
typedef typename std::remove_reference<T>::type TR;
std::unique_ptr<char, void(*)(void*)> own
(
abi::__cxa_demangle(typeid(TR).name(), nullptr,
nullptr, nullptr),
std::free
);
std::string r = own != nullptr ? own.get() : typeid(TR).name();
if (std::is_const<TR>::value)
r += " const";
if (std::is_volatile<TR>::value)
r += " volatile";
if (std::is_lvalue_reference<T>::value)
r += "&";
else if (std::is_rvalue_reference<T>::value)
r += "&&";
return r;
}
int
main()
{
typedef int& T;
std::cout << type_name<const T&>() << '\n';
}
Для меня это печатает:
int&
Таким образом, приведенное выше упрощает:
std::is_constructible<int&, int&>::value // true
который должен отвечать true
, поскольку lvalue int
должно быть конструктивным из неконстантного lvalue int
.