为什么某些编译器会拒绝匿名对象作为指针传递?

时间:2018-02-08 08:27:00

标签: c++ visual-c++ g++ anonymous-objects

尝试运行此code,以查看如何在单个表达式中调用匿名对象ctor / dctor:

#include <math.h> 
#include <iostream>

using namespace std;

class Test {
    public:
        int mA = 0;

    Test() { 
        mA = 1000;
        cout << "ctor test" << endl;
    }
    ~Test() { 
        cout << "dctor test" << endl;    
    }
};

class MainPanel {
    public:
        Test mTest;

    MainPanel(Test *test) : mTest(*test) { 
        cout << "ctor main" << endl;
    }
    ~MainPanel() { 
        cout << "dctor main" << endl;    
    }
};

Test Crea() {
    cout << "crea" << endl;
    return Test();
}

int main() 
{   
    cout << "init " << endl;
    MainPanel mainPanel = MainPanel(&Crea());
    cout << mainPanel.mTest.mA << endl;
    cout << "end " << endl;
}

但是(例如此处有g++)它拒绝此代码:error: taking address of temporary [-fpermissive]

相反,msvc似乎permitted

为什么首先阻止它会“危险”?

2 个答案:

答案 0 :(得分:2)

由于悬挂指针的风险,它被认为是危险的。原始指针无法指示它们指向的对象将持续多长时间。这是MSVC的非标准行为。

与参考文献形成对比,如果您要使用它们:

MainPanel(Test const&);
MainPanel(Test &&);

两个c'tors都准确地展示了他们期望接收的对象的值类别,甚至可以相应地处理它。通过复制或蚕食来源。不能用指针做到这一点。

答案 1 :(得分:1)

Visual Studio允许它作为“非标准扩展”。请参阅here

{}标准C ++中不允许这样做的原因here