をスキップ:私が使用して(私には奇妙に思えるいくつかの行動を説明するために私を助けてください私は以下のように4つのコンストラクタを持つクラス、および機能を持っているコンストラクタは、関数呼び出しとして解釈され、移動コンストラクタはstrangly
using namespace std;
class ABC {
public:
ABC() {
cout << "ABC()\n";
}
ABC(int) {
cout << "ABC(int)\n";
}
ABC(ABC&) {
cout << "ABC(&)\n";
}
ABC(ABC&&) {
cout << "ABC(&&)\n";
}
};
void ff(ABC t) { }
MSVC 2016をコンパイルするには):
1)なぜ、私はCBC301の "ABC a1(ABC(__cdecl *)(void))":プロトタイプ関数が呼び出されていない次のコード:
void main() {
ABC a1(ABC());
ff(ABC(5));
}
と実行時に、私は次のような出力を得ることを期待:私は本当に取得
ABC()
ABC(&&)
ABC(int)
ABC(&&)
が、何が、私はそこにある
void main() {
ABC a1(ABC(5));
ff(ABC(5));
}
に変更する今場合
ABC(int)
2)でありますこれ以上の警告はありません。しかし、実行時に、私は何を得ることを期待することは
ABC(int)
ABC(&&)
ABC(int)
ABC(&&)
ですが、私が実際に取得することは
ABC(int)
ABC(int)
3である)今
void main() {
ABC(ABC());
ff(ABC(5));
}
それも、コンパイルされません。私はエラーC2660: "'ABC':関数は1つの引数を取ることはありません。
4)最後に、なぜ3)はコンパイルしないのですか?
void main() {
ff(ABC(5));
}
問題の一部:https://stackoverflow.com/questions/38951362/most-vexing-parse – NathanOliver
1と2のコードスニペットはまったく同じです。そして、 'int main()'でなく 'void 'でなければなりません。 – Slava
C++ 11以降を使用していますか? –