这是这个问题的根源
在使用 clang++/libc++ 和 g++/libstdc++ 编译以下代码时,我有不同的行为。
#include <type_traits>
#include <utility>
#include <iostream>
int main()
{
using array_t = int[42];
std::cout << "array_t:" << std::endl;
std::cout << " is_move_constructible: " << std::is_move_constructible<array_t>::value << std::endl;
std::cout << " is_move_assignable: " << std::is_move_assignable<array_t>::value << std::endl;
std::cout << std::endl;
using pair_t = std::pair<array_t, array_t>;
std::cout << "pair_t:" << std::endl;
std::cout << " is_move_constructible: " << std::is_move_constructible<pair_t>::value << std::endl;
std::cout << " is_move_assignable: " << std::is_move_assignable<pair_t>::value << std::endl;
std::cout << std::endl;
pair_t p1;
pair_t p2(std::move(p1));
return 0;
}
铿锵声(失败):
In file included from /home/soon/Src/C++/main/main.cpp:2:
/usr/include/c++/v1/utility:283:11: error: array initializer must be an initializer list
: first(_VSTD::forward<first_type>(__p.first)),
^
/home/soon/Src/C++/main/main.cpp:20:12: note: in instantiation of member function 'std::__1::pair<int [42], int [42]>::pair' requested here
pair_t p2(std::move(p1));
^
In file included from /home/soon/Src/C++/main/main.cpp:2:
/usr/include/c++/v1/utility:284:11: error: array initializer must be an initializer list
second(_VSTD::forward<second_type>(__p.second))
^
g++ 编译没有错误。输出是:
array_t:
is_move_constructible: 0
is_move_assignable: 0
pair_t:
is_move_constructible: 1
is_move_assignable: 1
我无法确定,哪个是正确的。正如我猜测的那样,如果一个类包含不可移动构造的字段,则不能使用移动技术构造它。那是对的吗?