次のコードはC++で明確に定義されていますか? (*)不完全な型のデータメンバへのポインタ
標準で見る場所を見つけても苦労していて、ウェブを検索しても何も具体的なものが見つかっていません。それが動作する(またはに思える)GCCとクラン(のx86/x86_64版)の新しいバージョンではなく、Visual Studioの2015で失敗する(**)ので
struct S;
struct T {
constexpr T() = default;
bool S::* a = nullptr;
int b = 42;
};
const T t{};
// Test. Compiled using: cl /W4 /WX /FAs filename.cpp
#include <stdlib.h>
int main() {
if (t.b != 42) abort();
}
私が求めている理由は、アップデート2と3を更新していますRC。
バグを報告する前に、私が未定義の動作に頼っているのではなく、適切な用語を検索していないことを確認したいと思います。
this postで述べたように/vmg
と/vmb
を試してみました。
(*):私は主にC++ 14以降を気にしていますが、答えがC++ 11には適用されない理由はありません。
(**):コードが明確に定義されている場合は、コードジェネレータバグのように見えますが、ポインタの割り当て場所ではありません。 struct S
からstruct S{}
に変更すると、コードが「仕事」になるようです。
コードでは、正確に何を期待していますか? 'T'は' S'へのポインタを含むはずです、もしそうなら 'S * a = nullptr;'と書かれているのはなぜですか? – Xirema
コンパイル[ここ](http://rextester.com/NFYP31324)と私自身のMSVS 2015です。バージョン14.0.23107.0を持っています。D14REL – NathanOliver
@ Xirema: 'T :: a'は[bool]データへのポインタですメンバ](http://en.cppreference.com/w/cpp/language/pointer#Pointers_to_data_members)を不完全な型 'S'で返します。 @ NathanOliver:それは私のためにコンパイルされますが、実行されると '中止されます。 – user786653