以下、テストコード:
#include <vector> #include <memory> // for std::unique_ptr // implicit move struct X { X() = default; X( std::vector<int> src ) : p( new auto( std::move(src) ) ) {} // X( X&& ) = default; // noexcept-specification int* begin() noexcept(true) { return p ? p->data() : nullptr; // nullptr } int* end() noexcept(true) { return p ? ( p->data() + p->size() ) : nullptr; } private: std::unique_ptr<std::vector<int>> p; }; #include <iostream> #include <type_traits> // constexpr template<class T> constexpr bool is_copyable( T&& ){ return std::is_constructible<typename std::decay<T>::type, T&&>::value; } int main() { X x = std::vector<int>{ 1, 2, 3 }; // X y = x; // ill-formed X y = std::move(x); // x = y; // ill-formed x = std::move(y); // constexpr, noexcept operator constexpr bool copyable = is_copyable(x); constexpr bool begin_throws = !noexcept( x.begin() ); std::cout << std::boolalpha; std::cout << copyable << std::endl; // false std::cout << begin_throws << std::endl; // false // range-based for for( auto const& i : x ){ std::cout << i << std::endl; } }
結果:
false false 1 2 3
問題なし。