为什么以下代码调用a
的复制构造函数?
class a {
public:
a(int x) : x_(x) { std::cout << "a constructor" << std::endl; }
a(a&& a_) { std::cout << "a move constructor" << std::endl; }
a(const a& a_) { std::cout << "a copy constructor" << std::endl; }
private:
int x_;
};
class b {
public:
b(std::vector<a>&& v) : v_(std::move(v)) {}
private:
std::vector<a> v_;
};
int main() {
b s({2, 3, 4, 5, 6});
}
输出如下:
a constructor
a constructor
a constructor
a constructor
a constructor
a copy constructor
a copy constructor
a copy constructor
a copy constructor
a copy constructor
我期待没有副本,因为矢量是在适当的位置创建的,并作为右值引用传递,然后移动。实际发生了什么?
答案 0 :(得分:3)
$events = [
[ 'categoryId' => 1, 'eventId' => 2, 'eventName' => 3, 'vendorName' => 4 ],
[ 'categoryId' => 5, 'eventId' => 6, 'eventName' => 7, 'vendorName' => 8 ],
[ 'categoryId' => 9, 'eventId' => 10, 'eventName' => 11, 'vendorName' => 12 ],
];
print_r(array_column($events, 'categoryId'));
是std::initializer_list<T>
个对象数组的包装器。 (更准确地说,std::initializer_list<T>::reference
是const T
)。请注意const T&
。它必须是这样的,因为它的元素可以是文字。
这意味着const
的{{1}}构造函数必须将列表中的元素复制到向量中,它无法移动它们。