C++のぼくがよくわかってなかった話

まずこういうコードを書きます

#include <iostream>
using namespace std;

struct S
{
    int i;
};

int main()
{
    S s();

    cout << s.i << endl;
    return 0;
}

これを最初に書いた時の気持ちは、何故か、Sのデフォルトコンストラクタを呼び出してsを〜という感じだったのですが(その心は、引数ありコンストラクタから引数を全部取っ払ってunitになったみたいな感じだったんだと思います...)、これだとsは s :: () -> S といった関数の宣言になってしまうようです。

で、局所的な宣言に対して実装を与えるのってどうすれば良いんだろうと思ったんですが...

#include <iostream>
#include <typeinfo>
#include <cxxabi.h>
using namespace std;

struct S
{
    int i;
};

int status;
char* dm(const char* ma)
{
    return abi::__cxa_demangle(ma,0,0,&status);
}

int main()
{
    S s();

    cout << dm(typeid(s).name()) << endl;
    cout << s().i << endl;
    return 0;
}

S s()
{
    S s_ = {42};
    return s_;
}
/Users/ranha/gcc-misc/constructor% g++-mp-4.4 kowai.cpp
/Users/ranha/gcc-misc/constructor% ./a.out 
S ()()
42

これで出来るんですね。ちょっと試した感じ不味そうな事は出来ないし、何かに使えるのかなぁ。