- 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)} {}
MacFerden 08.08.2016 07:16 # +19
Antervis 08.08.2016 08:49 # +26
laMer007 08.08.2016 13:11 # +15
kurwa 08.08.2016 13:13 # +15
laMer007 08.08.2016 13:17 # +15
kurwa 08.08.2016 13:23 # +15
laMer007 08.08.2016 13:51 # +15
Antervis 08.08.2016 14:14 # +14
- Не учтено, что часть аргументов могут передаваться по lvalue, а другая - по rvalue
- как ты сказал - перепутаны местами move|copy
- а еще у меня смутное (но навязчивое) чувство, что constexpr там никогда не constexpr
Soul_re@ver 08.08.2016 14:24 # +14
ORLY? http://coliru.stacked-crooked.com/a/e07a58d290c0f430
> Не учтено, что часть аргументов могут передаваться по lvalue, а другая - по rvalue
Тут да, ошибка компиляции будет.
> а еще у меня смутное (но навязчивое) чувство, что constexpr там никогда не constexpr
Если конструктор data constexpr, то всё ок.
kurwa-nextgen 08.08.2016 14:29 # +14
Это почему? Если передать в конструктор некий T&, то как раз V = T&. А вот если T&&, то V = T.
kurwa-nextgen 08.08.2016 14:25 # +17
Вот это плохо работает. Например, если передать в качестве параметров lvalue и rvalue ссылки, то компилятор не сможет вывести V. Эта же проблема с разной константностью.
Еще вместо этой опердени из тайптрейтов надо было использовать оператор noexcept: noexcept(noexcept(T(std::forward<V>(x))) )
Antervis 08.08.2016 14:58 # +14
jangolare 08.08.2016 17:24 # +14
jangolare 08.08.2016 17:34 # +14
Antervis 08.08.2016 18:11 # +14
Antervis 08.08.2016 18:07 # +14
jangolare 08.08.2016 18:12 # +14