c++ - 通过用户定义的构造函数初始化

标签 c++ initialization

考虑以下程序:

#include <iostream>

struct A
{
    A(int, int){ std::cout << "A(int, int)" << std::endl; }
};

A a(4,4);
A b{4,4};
A c({4,4});

int main(){ }

输出:

A(int, int)
A(int, int)
A(int, int)

DEMO

我感兴趣的是 abc 的初始化之间有区别吗?任何主题都是直接初始化的。

最佳答案

A a(4,4);

沼泽标准直接初始化

A b{4,4};

沼泽标准直接列表初始化。由于 A 没有 initializer_list 构造函数,所以这最终会做与上面相同的事情。没有 std::initializer_list 对象被构建或销毁。

A c({4,4});

直接初始化 c 来自A 临时文件,后者又被copy-list-initialized来自 braced-init-list {4, 4}。请注意,如果 A::A(int, int)explicit,这将不起作用,因为在那种情况下,copy-list-initialization 将是格式错误的并且你没有可行的构造函数可以调用。临时的构建和销毁可能会被省略,而且通常是这样。

关于c++ - 通过用户定义的构造函数初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27163395/

相关文章:

c++ - 具有可变数量的模板参数的简单方法

c++ - 你如何在 Qt 中获得一个小部件的 child ?

C - 使用 strlen 使数组大小错误的数组初始化

c++ - 为什么这里不能访问enum?

c++ - 在 C++ 中初始化 const 字符串的静态 const 数组

c++ - 如何在 C 或 C++ 中打印宏名称

c++ - 哪个编译器给出 longest long double

c++ - 程序不计算

gcc - 用特定值填充向量 (SSE2) 的最快方法。模板友好

java - 为什么变量在循环内可见而在循环外看不到?