【发布时间】:2019-02-17 07:40:57
【问题描述】:
忽略编译器的复制/移动省略,我想知道以下代码(假设 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 }
【问题讨论】:
-
您想要理论答案还是实际答案?
-
理论上的,如果可能的话。我知道实际上它总是会被任何适当的编译器忽略。
-
在这种情况下,您应该提供一个完整的示例(没有“假设 X 存在”)并用语言律师标记您的问题。
-
@A.S.语言要求某些省略。忽略 all 省略不会给你一个有意义的答案。虽然你可以假设 optional 省略不会发生。
-
最后,将您的问题绑定到 c++98、c++11、c++14、c++17 或 c++2a。
标签: c++ c++11 arguments language-lawyer list-initialization