相关疑难解决方法(0)

为什么非const引用不能绑定到临时对象?

为什么不允许对一个临时对象进行非const引用,哪个函数getx()返回?显然,这是C++标准禁止的,但我对这种限制的目的感兴趣,而不是对标准的引用.

struct X
{
    X& ref() { return *this; }
};

X getx() { return X();}

void g(X & x) {}    

int f()
{
    const X& x = getx(); // OK
    X& x = getx(); // error
    X& x = getx().ref(); // OK
    g(getx()); //error
    g(getx().ref()); //OK
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. 很明显,对象的生命周期不是原因,因为C++标准不禁止对对象的持续引用.
  2. 很明显,上面的示例中的临时对象不是常量,因为允许调用非常量函数.例如,ref()可以修改临时对象.
  3. 此外,ref()允许您欺骗编译器并获取此临时对象的链接,这解决了我们的问题.

此外:

他们说"为const引用分配一个临时对象可以延长这个对象的生命周期","但是对于非const引用却没有任何说法".我的其他问题.以下赋值是否延长了临时对象的生命周期?

X& x = getx().ref(); // OK
Run Code Online (Sandbox Code Playgroud)

c++ const reference temporary c++-faq

221
推荐指数
6
解决办法
9万
查看次数

无法传递临时对象作为参考

这是一个非常小的例子:

class Foo
{
public:
    Foo(int x) {};
};

void ProcessFoo(Foo& foo)
{
}

int main()
{
    ProcessFoo(Foo(42));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

以上编译在Visual Studio上很好,但在Linux和Mac上生成错误.

编译上面会生成这个:

$ g++ -std=c++11 -c newfile.cpp

newfile.cpp: In function ‘int main()’:
newfile.cpp:23:23: error: invalid initialization of non-const reference of type ‘Foo&’ from an rvalue of type ‘Foo’
     ProcessFoo(Foo(42));
                       ^
newfile.cpp:14:6: note: in passing argument 1 of ‘void ProcessFoo(Foo&)’
 void ProcessFoo(Foo& foo)
Run Code Online (Sandbox Code Playgroud)

我找到了三个解决方法:

  1. 避免使用内联临时变量来调用ProcessFoo.

像这样:

Foo foo42(42);
ProcessFoo(foo42);
Run Code Online (Sandbox Code Playgroud)
  1. ProcessFoo采用const引用: void ProcessFoo(const Foo& foo)

  2. ProcessFoo只是让Foo按值传递. void ProcessFoo(Foo foo)

为什么编译器禁止我的原始代码?(这是什么防守)?上面三个满足编译器的解决方法中的每一个都有什么用?MSVC会允许什么,但不是g …

c++ visual-c++ c++11

17
推荐指数
2
解决办法
1万
查看次数

为什么临时对象可以绑定到const引用?

问题来源:

唯一失败的情况是通过非常量引用传递参数,因为临时变量无法绑定到它。

void DrawLine(const Vector& v1, const Vector& v2);

如果对象是临时的,为什么引用会对const临时对象的生命周期产生影响?

我想我也没有完全理解在参数中创建的临时对象的存在范围。

c++ stack pass-by-reference

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