相关疑难解决方法(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
查看次数

什么时候返回语句需要显式移动?

对另一个问题评论中, Jonathan Wakely回应了我的陈述:

您永远不需要显式移动局部变量函数返回值.这是隐含的举动

- >

...永远不要说永远......如果局部变量与返回类型的类型不同,则需要显式移动,例如std::unique_ptr<base> f() { auto p = std::make_unique<derived>(); p->foo(); return p; },但如果类型相同,则可能会移动...

所以有时我们可能不得不在返回时移动局部变量.

这个例子

std::unique_ptr<base> f() { 
  auto p = std::make_unique<derived>();
  p->foo(); 
  return p; 
}
Run Code Online (Sandbox Code Playgroud)

很好,因为它给出了编译错误

> prog.cpp:10:14: error: cannot convert ‘p’ from type
> ‘std::unique_ptr<derived>’ to type ‘std::unique_ptr<derived>&&’
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有一个很好的机会来检测这一般 - 这是这里的语言规则或unique_ptr ??

c++ return implicit-conversion move-semantics c++11

18
推荐指数
1
解决办法
1442
查看次数

标签 统计

c++ ×2

c++11 ×2

c++14 ×1

implicit-conversion ×1

move-semantics ×1

return ×1