Рассмотрим следующий код
struct A {
A(int id) : id_ { id } {}
A(const A& rhs) { std::cout << "cctor from " +
std::to_string(rhs.id_) << std::endl; }
A(A&& rhs) { std::cout << "mctor from " +
std::to_string(rhs.id_) << std::endl; }
int id_;
};
template<typename T>
struct B1 {
constexpr B1(T&& x) noexcept : x_ { std::forward<T>(x) } {}
T x_;
};
template<typename T>
struct B2 {
constexpr B2(T&& x) noexcept;
T x_;
};
template<typename T>
constexpr
B2<T>::B2(
T&& x
) noexcept :
x_ { std::forward<T>(x) } {
}
int
main(
) {
A a { 1 };
//B1 b11 { a }; // Not compiling
B1 b12 { A { 2 } };
B2 b21 { a };
B2 b22 { A { 3 } };
return 0;
}
, который дает
mctor from 2
mctor from 3
Таким образом, в общем случае выглядит так, как будто внешне определенный конструктор прекрасно перенаправляет категорию значения своего аргумента, в то время как встроенныйне конструктор.
Это то, что внешне определенный конструктор обрабатывается как шаблон функции (который прекрасно передает свои аргументы) или что здесь происходит?
Ссылки на соответствующий раздел стандартабудет приветствоваться.
Я использую GCC 7.2.0.