相关疑难解决方法(0)

119
推荐指数
1
解决办法
6万
查看次数

绑定到函数参数的引用是否会延长该临时的生命周期?

我有这个代码(简化版):

const int& function( const int& param )
{
     return param;
}

const int& reference = function( 10 );
//use reference
Run Code Online (Sandbox Code Playgroud)

我不能完全决定C++ 03标准在12.2/5美元的措辞

引用绑定的临时对象或作为临时绑定的子对象的完整对象的临时对象在引用的生命周期内持续存在...

适用于此.

reference在上述有效或晃来晃去的代码变量?调用代码中的引用是否会延长作为参数传递的临时值的生命周期?

c++ reference object-lifetime function-parameter

9
推荐指数
1
解决办法
1376
查看次数

拥有右值引用变量意味着什么?

我想我理解具有如下签名的函数:

void f(std::string&&):
Run Code Online (Sandbox Code Playgroud)

它将应用于右值以重用其资源。然而,我偶尔会看到这样的代码:

std::string t();

std::string&& s = t();
Run Code Online (Sandbox Code Playgroud)

其中变量被初始化为右值引用。(这里我写了 t 按值返回,但如果按左/右值引用返回时行为不同,有兴趣知道)。

通常,我在有关 C++ 的帖子/谜题中看到这一点,而不是在生产代码中。

我有几点想了解一下:

  1. 这种行为的规则是什么?
  2. 与通过值或左值常量引用捕获相比,这有什么优势?在我看来,如果您按值捕获,则移动/复制将被省略,并且您将能够修改它(与 const-ref 不同)。我对此可能是不正确的,但如果是这样的话,我看不出右值引用在这里会有什么好处
  3. 当 t 返回右值引用时,其行为是否有所不同?返回右值引用的充分理由是什么?我猜 std::move 可以,但是它在什么时候会有用呢?

c++ rvalue-reference move-semantics

4
推荐指数
1
解决办法
561
查看次数

&& 是限定符吗?

我知道这一点const,并且volatile在 C++ 规范中被称为“cv 限定符”,例如[basic.type.qualifier]

现在我有这段代码(godbolt)无法编译。

#include <string>
class Dummy
{
    std::string member{"test"};

    public:
    std::string const && foo() &&
    { return std::move(member); }
};

int main()
{
    Dummy d;
    std::string s = d.foo();
}
Run Code Online (Sandbox Code Playgroud)

它无法编译,因为w它是一个 LValue 并且foo()仅针对 RValue 存在。这很好,也是意料之中的。

但让我们看一下错误消息:

<source>: In function 'int main()':
<source>:14:26: error: passing 'Dummy' as 'this' argument discards qualifiers [-fpermissive]
   14 |     std::string s = d.foo();
      |                     ~~~~~^~
<source>:7:26: note:   in call to 'const …
Run Code Online (Sandbox Code Playgroud)

c++

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