[解決済み] 3つの主要なC++コンパイラで、プログラムのコンパイルが異なっています。どれが正しいのでしょうか?
2022-05-15 14:28:09
質問
前回の質問に対する興味深いフォローアップとして(実用上の重要性は高くないが)。 なぜ C++ では、変数を宣言するときに変数名を括弧で囲むことができるのですか?
で括られた宣言を組み合わせると、変数名から 注入されたクラス名 という機能を組み合わせることで、コンパイラの動作に関して驚くべき結果が得られるかもしれません。
次のプログラムを見てください。
#include <iostream>
struct B
{
};
struct C
{
C (){ std::cout << "C" << '\n'; }
C (B *) { std::cout << "C (B *)" << '\n';}
};
B *y = nullptr;
int main()
{
C::C (y);
}
-
g++ 4.9.2 でコンパイルすると、次のようなコンパイルエラーが発生します。
main.cpp:16:10: error: cannot call constructor 'C::C' directly [-fpermissive]
-
MSVC2013/2015で正常にコンパイルされ、以下のように表示されます。
C (B *)
-
clang 3.5で正常にコンパイルされ、以下のように表示されます。
C
だから、義務的な質問は、どれが正しいかです :)
(私はclang版に強く惹かれましたし、typedefで型変更した後に変数宣言をやめるというmsvcのやり方はちょっと変な気がします)
どのように解決するのですか?
GCC は、少なくとも C++11 のルックアップ規則に従って、正しいです。3.4.3.1 [class.qual]/2 では、ネストされた名前指定子がクラス名と同じ場合、注入されたクラス名ではなく、コンストラクタを参照することを指定しています。それは例を示しています。
B::A ba; // object of type A
A::A a; // error, A::A is not a type name
struct A::A a2; // object of type A
MSVC が関数型のキャスト式と誤認して、一時的に
C
と
y
という変数の宣言であると誤認してしまいます。
y
という変数の宣言と誤解します。
C
.
関連
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] なぜこのプログラムは3つのC++コンパイラで誤って拒否されるのですか?
-
[解決済み] 末尾再帰最適化を行うC++コンパイラがあるとすれば、どのコンパイラですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] なぜインジェクションされたクラス名があるのですか?