4

C++

Objects of this class couts messages when they are constructed and destroyed. I tried to construct a temporary object using a declaration of only the class name, but it gave an unexpected output.

In #1, I instantiate a temporary nameless object using parentheses.

In #2, I instantiate a temporary nameless object using uniform initialization.

I didn't know whether #3 would compile. I only thought that if #3 were to compile, it would signify a construction of a temporary nameless object. It does compile, but no object is constructed as seen from the blankness of the console output under #3. What is happening here?

#include <iostream>

class A
{
public:
    A() {std::cout << "constructed\n";}
    ~A() {std::cout << "destroyed\n";}
};

auto main() -> int
{
    std::cout << "#1:\n";
    A();
    std::cout << "#2:\n";
    A{};
    std::cout << "#3:\n";
    A;
    return 0;
}

Console Output:

#1:
constructed
destroyed
#2:
constructed
destroyed
#3:

Note: This was compiled in VC11 with November 2012 CTP. It doesn't compile in g++ 4.8.0 or clang 3.2, which gives error: declaration does not declare anything [-fpermissive] and fatal error: 'iostream' file not found, respectively.

4

3 に答える 3

5

このコードは、すべての C++ 標準 (C++98、C++03、C++11) では無効であり、コンパイルすべきではありません。

型はステートメントではありません。

実際、Visual C++ も g++ もコンパイルしません。

おっと、g++ はプログラムを正しく診断しますが、2012 年 11 月の Visual C++ の CTP は次のことを行いません。

[D:\開発\テスト]
> (cl 2>&1) | 検索 /i "C++"
Microsoft (R) C/C++ 最適化コンパイラ バージョン 17.00.51025 for x86

[D:\開発\テスト]
> cl /nologo /EHsc /GR /W4 foo.cpp
foo.cpp

[D:\開発\テスト]
> g++ -std=c++0x -pedantic -Wall foo.cpp
foo.cpp: 関数 'int main()' 内:
foo.cpp:17:5: エラー: 宣言は何も宣言していません [-fpermissive]

[D:\開発\テスト]
> _

これはコンパイラのバグであり、 Microsoft Connectで報告してみてください。

于 2013-03-14T02:21:00.500 に答える
2

あなたのコードを gcc バージョン 4.5.3 で試してみました。コンパイルすると、次のエラー メッセージが表示されました。コンパイラが内部で何かをしている可能性が非常に高いです。

于 2013-03-14T02:19:50.830 に答える
2

両方g++clangエラーを与える17:5: error: declaration does not declare anything

使用しているコンパイラが何であれ、ラインを完全に最適化する可能性がありますが、それは単なる推測です。何をコンパイルしていますか?

これは合法ではありません。int;法的声明ではありません。

于 2013-03-14T02:21:22.983 に答える