使用专用复制/移动构造函数进行聚合初始化
Aggregate initialization with private copy/move constructors
我在为初始化聚合的另一个问题测试一些东西时遇到了这个问题。我使用的是GCC 4.6。
当我用列表初始化聚合时,所有成员都是在适当的位置构建的,而不需要复制或移动。也就是说:
int main()
{
std::array<std::array<Goo,2>,2>
a { std::array<Goo,2>{Goo{ 1, 2}, Goo{ 3, 4}} ,
std::array<Goo,2>{Goo{-1,-2}, Goo{-3,-4}} };
}
让我们通过制造一些嘈杂的构造函数来确认:
struct Goo
{
Goo(int, int) { }
Goo(Goo &&) { std::cout << "Goo Moved." << std::endl; }
Goo(const Goo &) { std::cout << "Goo Copied." << std::endl; }
};
运行时,不会打印任何消息。然而,如果我将move构造函数设为私有,编译器会抱怨‘Goo::Goo(Goo&&)’ is private
,尽管显然不需要move构造函数。
有人知道移动构造函数是否有这样的聚合初始化可访问的标准要求吗?
不调用复制或移动构造函数是标准特别允许的优化(但不是必需的)。
为了在编译器之间保持一致,实现必须检查是否可以调用构造函数,如果它不想优化它的话。
请允许我在GCC 4.6:中用一个修改过的案例来跟进Bo的回答
struct Goo
{
Goo(int x, unsigned int n) : x(x), s(new char[n]) { }
private:
Goo(const Goo &);
Goo(Goo &&);
int x;
char * s;
};
struct Foo
{
int a;
Goo g;
};
void f()
{
Foo k { 3, {1,2} }; // works
//Foo t { 1, Goo{5,6} }; // fails
//Foo r { 0, Goo(7,8) }; // fails
}
为什么没有可访问的复制/移动构造函数(请注意,Goo
显然不是POD或聚合),即使是,第一种形式的就地构造也可以,但后两种(功能相同)形式则不然?标准的哪一部分规定编译器必须在后两种情况下检查可访问的构造函数,而不是在第一种情况下?
相关文章:
- 为什么std::vector和std::valarray初始化构造函数不同
- 初始化构造函数C++中结构的向量
- C++ 中常量属性的初始化构造函数错误
- 不正确的输出和变量未用Eclipse CDT初始化构造函数
- 如何使用嵌套初始化构造函数中的一维向量初始化矩阵
- 如何通过参数初始化构造函数中的数组?
- 是否有理由使用 malloc 初始化构造函数中的指针
- 如何在 c++ 中初始化构造函数中的二维数组
- 为什么初始化构造函数列表参数时会发生异常?
- 无法初始化构造函数
- 初始化构造函数的默认参数的优选方法是什么?
- 在C++17中使用空列表初始化构造函数时发生编译错误
- C++ 初始化构造函数初始化列表中的嵌套结构?
- 初始化构造函数c++中的向量
- g++ (GCC) 4.6.0 我有以下类,我正在尝试初始化构造函数的结构成员初始化列表
- 使用字符串文本初始化构造函数中的 std::array<char,x> 成员。海湾合作委员会错误?
- 初始化构造函数C++中函数的成员指针
- 在c++中初始化构造函数中的静态成员变量时出错
- memset()初始化构造函数中的对象
- 初始化构造函数C++中的成员向量