相关疑难解决方法(0)

可以在C++ 11/14中按值返回局部变量,导致在没有复制/移动时由rvalue构造返回值吗?

我知道在以下情况下编译器可以自由移动 - 构造返回值makeA(但也可以自由地删除副本或完全移动):

struct A
{
    A(A&);
    A(A&&);
};

A makeA()
{
    A localA;
    return localA;
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否允许编译器通过rvalue引用A从类型的本地对象构造类型的对象(B如果它是在return语句中构造的).换句话说,在下面的例子中,是否允许编译器A为返回值选择构造函数4?

struct B { };
struct A {
    A(A&);  // (1)
    A(A&&); // (2)
    A(B&);  // (3)
    A(B&&); // (4)
};

A makeA()
{
    B localB;
    return localB;
}
Run Code Online (Sandbox Code Playgroud)

我问这个是因为在我看来,允许类型的本地对象A在return语句中被视为rvalue 的相同逻辑也应该允许任何类型的本地被视为rvalue,但我找不到任何这种例子或问题.

c++ c++11 c++14

32
推荐指数
1
解决办法
1893
查看次数

为什么三元运算符会阻止返回值优化?

为什么三元运算符会阻止MSVC中的返回值优化(RVO)?考虑以下完整的示例程序:

#include <iostream>

struct Example
{
    Example(int) {}
    Example(Example const &) { std::cout << "copy\n"; }
};

Example FunctionUsingIf(int i)
{
    if (i == 1)
        return Example(1);
    else
        return Example(2);
}

Example FunctionUsingTernaryOperator(int i)
{
    return (i == 1) ? Example(1) : Example(2);
}

int main()
{
    std::cout << "using if:\n";
    Example obj1 = FunctionUsingIf(0);
    std::cout << "using ternary operator:\n";
    Example obj2 = FunctionUsingTernaryOperator(0);
}
Run Code Online (Sandbox Code Playgroud)

使用VC 2013编译如下: cl /nologo /EHsc /Za /W4 /O2 stackoverflow.cpp

输出:

using if:
using ternary operator: …
Run Code Online (Sandbox Code Playgroud)

c++

11
推荐指数
1
解决办法
1138
查看次数

标签 统计

c++ ×2

c++11 ×1

c++14 ×1