- 1
- 2
- 3
- 4
- 5
template<typename V>
constexpr Vector(V&& x, V&& y, V&& z) noexcept(std::is_lvalue_reference<V>::value ?
std::is_nothrow_move_constructible<V>::value :
std::is_nothrow_copy_constructible<V>::value) :
data{std::forward<V>(x), std::forward<V>(y), std::forward<V>(z)} {}
- Не учтено, что часть аргументов могут передаваться по lvalue, а другая - по rvalue
- как ты сказал - перепутаны местами move|copy
- а еще у меня смутное (но навязчивое) чувство, что constexpr там никогда не constexpr
ORLY? http://coliru.stacked-crooked.com/a/e07a58d290c0f430
> Не учтено, что часть аргументов могут передаваться по lvalue, а другая - по rvalue
Тут да, ошибка компиляции будет.
> а еще у меня смутное (но навязчивое) чувство, что constexpr там никогда не constexpr
Если конструктор data constexpr, то всё ок.
Это почему? Если передать в конструктор некий T&, то как раз V = T&. А вот если T&&, то V = T.
Вот это плохо работает. Например, если передать в качестве параметров lvalue и rvalue ссылки, то компилятор не сможет вывести V. Эта же проблема с разной константностью.
Еще вместо этой опердени из тайптрейтов надо было использовать оператор noexcept: noexcept(noexcept(T(std::forward<V>(x))) )