曾几何时,我认为像这样的代码会失败:
const MyClass& obj = MyClass();
obj.DoSomething();
Run Code Online (Sandbox Code Playgroud)
因为MyClass对象将在其完整表达式的末尾被销毁,而将obj作为悬空引用.但是,我(这里)得知这不是真的; 该标准实际上有一个特殊的规定,允许const引用保持临时值,直到所述引用被自己销毁.但是,有人强调,只有const引用具有这种能力.今天我在VS2012中运行了以下代码作为实验.
struct Foo
{
Foo() { std::cout << "ctor" << std::endl; }
~Foo() { std::cout << "dtor" << std::endl; }
};
void f()
{
Foo& f = Foo();
std::cout << "Hello world" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
调用时的输出f()是:
ctor
Hello world
dtor
Run Code Online (Sandbox Code Playgroud)
所以我查看了C++ 11草案标准,并且只发现了这个(§12.2/ 4):
有两种情况,临时表在与完整表达结束时不同的地方被摧毁.第一个背景[不适用].第二个上下文是引用绑定到临时的.绑定引用的临时对象或绑定引用的子对象的完整对象的临时对象在引用的生命周期内持续存在.
const上面显然没有这个词.所以; 有没有为C++ 11改变这种行为,我const开始的事情是错的,还是VS2012有一个bug,我还没有找到标准的相关部分?
我想在c ++上做得更好.我在main()中有一个Test类和下面的代码.
Test *pObj = new Test();
Run Code Online (Sandbox Code Playgroud)
如果我们通过逐步逐步调试来调试,首先它转到新函数来分配内存,然后调用构造函数.然后它回到main()函数.众所周知,构造函数不会返回任何内容.在那种情况下,为什么pObj将具有由new分配的指针?知道编译器是如何实现的吗?
我偶然发现了这个问题(这是一个不同的例子).大多数人说构造函数不会返回任何内容.但是,为什么我的例子有效呢?
sequence(1, 2)是一个构造函数,显然可以在我的机器上使用.我使用g++和尝试没有选项和C++ 11选项.两者都适用于我的情况.
这个例子来自一门课程.我按原样复制,无论是否public有意义,或其他.
例:
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
void printer(int i) {
cout << i << ", ";
}
struct sequence {
int val, inc;
public:
sequence(int s, int i) : val(s), inc(i) {
cout << "Sequence(" << val << ", " << inc << ")" << endl;
}
operator int() const {//LINE I
int r = val;
cout << r << endl; …Run Code Online (Sandbox Code Playgroud)