看看这段代码:返回*&object时是否允许复制/移动elision?
#include <stdio.h>
struct Foo {
Foo() { }
Foo(const Foo &) { printf("copy\n"); }
Foo(Foo &&) { printf("move\n"); }
};
Foo getFoo() {
Foo f;
return *&f;
}
int main() {
getFoo();
}
C++ 14标准说(12.8/31),即允许复制/移动省音:在一个函数
return语句中有一类返回类型,当 表达式是具有相同cv-未定义 类型的非易失性自动对象(函数或catch-clause参数除外)的名称作为函数返回类型时,可以省略复制/移动操作 通过将自动对象直接构建到中函数的返回值
在我的示例中,返回表达式不是名称,所以我不认为允许使用elision。
我检查GCC /铛/ MSVC,虽然铛/ MSVC不复制的Elid,GCC一样。 GCC在这里违反标准吗?
好吧,我不明白为什么编译器将保持冗余'* '和'&'操作符。另外,您使用的是哪个版本的编译器?你是用C++ 14模式构建的吗?另外,在引用标准时,请指明代码来自哪里(名称或章节/章节编号)。 –
在完全不相关的说明中,为什么使用'printf'输出?为什么不'std :: cout'? –
@Someprogrammerdude - 编译器可能不会将它们保留在发出的代码中。但是它们确实影响了标准观点表达式的语义。这根本不是一个id表达式(或名称)。 – StoryTeller