c++ - 大括号初始值设定项列表作为函数参数

标签 c++ c++11 arguments language-lawyer list-initialization

忽略编译器的复制/移动省略,我想知道以下代码(假设 foo 有一个接受三个整数的构造函数)是否“语法上”创建一个临时对象然后复制/移动初始化函数参数,或者直接调用构造函数:

void acceptsFoo(foo a);

acceptsFoo({1, 2, 3});

那么这个案例呢?

//ignoring RVO optimization
foo returnsFoo()
{
   return {1, 2, 3};
}

我知道下面的代码,即使没有复制/移动省略,也与调用构造函数相同,因此不会生成任何临时文件,但我找不到有关上面代码的信息。

foo = { 1, 2, 3 } //assuming the constructor is non-explicit
foo { 1, 2, 3 }

最佳答案

当花括号初始化列表用于初始化对象时,它用于初始化对象。期间。

将花括号初始化列表应用于函数参数意味着根据列表初始化规则使用值列表初始化该参数。当您返回一个花括号初始化列表时,它用于根据列表初始化规则用值列表初始化返回值对象。

理论上没有临时对象被复制到参数/返回值中。

现在(C++17 之前),如果你完成了 acceptsFoo(foo{1, 2, 3});return foo{1, 2, 3},然后这将引发临时文件的创建,然后将其用于初始化参数/返回值。

关于c++ - 大括号初始值设定项列表作为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52298990/

相关文章:

c++ - 记住创建空白 win32 窗口的所有内容很重要吗

c++ - 为 vardiac 和 normal 模板设置 typename 默认值

c++ - 引用你不拥有的 "std::unique_ptr"(使用原始指针?)

python - 我应该对 Python 中的错误/非法参数组合提出哪个异常?

c++ - 为什么minhook库目录不存在

c++ - 数字为 std::string 还是 double?

c++ - 在 std::for_each 中使用 std::bind

c++ - 如何解决没有上下文类型信息错误的重载函数?

python - 这些代码行是做什么的? (运动模拟)

.net - 即使在 Regasm 之后,VS 2005 也找不到 .NET DLL 类定义