当-fno-elide-constructors选项与clang或gcc一起使用,并且按值返回对象时,我对C++的正确语义感兴趣。如果我有此功能并调用它:

X foo()
{
    X x(0);
    X y(1);
    X z;
    if (rand() > 50)
        z = x;
    else
        z = y;
    return z;
}

X z = foo();

那么我可以看到X的副本构造函数仅被调用一次。但是,如果我稍微修改一下函数,如下所示:
X foo()
{
    X x(0);
    X y(1);
    if (rand() > 50)
        return x;
    else
        return y;
}

X z = foo();

然后复制构造函数被调用两次。从实现的 Angular 来看,在后一种情况下我可能会觉得有必要这样做,但令我感到困惑的是,似乎即使我们明确关闭了复制省略功能,根据函数的实现方式,也会调用不同数量的复制构造函数。

标准中是否有涵盖此行为的部分?

最佳答案

在第一种情况下,您会看到return value optimization,这基本上意味着编译器会在函数的返回槽中分配z。在第二种情况下,此方法将不起作用,因此您在此处看到了另一个副本。复制省略是不同的:http://en.wikipedia.org/wiki/Copy_elision,在这里不适用。该标准只是说类似编译器可以自由省略不必要的副本,这允许但不要求任何一种优化。

关于c++ - 具有-fno-elide-constructors的临时对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23854249/

10-16 00:39