おぉ! CWG issue 232 は見落としていました! ありがとうございます! 現在の方向性は, indirection は許容して lvalue-to-rvalue conversion の段階で U.B. にしよう,ということですか.だとすると,関連する疑問であった
class X {
void f();
};
int main() {
X *p = nullptr;
p->f();
}
は X::f で this が指している empty lvalue に対して lvalue-to-rvalue conversion が走らない限り完全に規格に準拠した well-defined program (ということに将来的にはなりそう)ということですか.
未定義動作の話と聞いて混ざりにきました。
@Cryolite 現状の規格では *
演算子の結果が有効なポインタについてしか規定されていないので、現状は未定義動作という結論になるかと思います。(ヌルポインタniの場合の動作について処理系に対してなんの制約も無い)
明記が無いことも含めて規格の不備であるのは CWG #232 のとおり間違いないと思います。
this != nullptr を前提とした最適化がすでにいくつかのコンパイラで行われているので、非 static なメンバ関数呼び出しはメンバアクセスと同様に未定義のままとなるべきだろうと思ってます。ここらへん、修正案では抜けてる感じ。
2005 年の Note を最後に CWG #232 の進展が無いのはおかしいだろうと思うので std-discussion に投げて話を進めたほうがいいと思うんですけど、そんなつもりは無いですか?(このチャットルームで規格文面の話をするのもどうかと思うので・・・。)
std::array
から std::tuple
に入る