C++03 標準 (5.3.4/7) によると:
direct-new-declarator の式の値が 0 の場合、要素のない配列を割り当てるために割り当て関数が呼び出されます。
私の読みでは、これは、このコードが合法であり、特定の効果があることを意味します。
#include <iostream>
#include <string>
using namespace std;
class A
{
public:
A() : a_(++aa_) {};
int a_;
static int aa_;
};
int A::aa_ = 0;
int main()
{
A* a = new A[0];
// cout << "A" << a->a_ << endl; // <-- this would be undefined behavior
}
このコードをデバッガーで実行すると、A
のコンストラクターが呼び出されないことがわかります。 new
スローせず、null 以外の明らかに有効なポインターを返します。ただし、 at の値a->a_
は初期化されていないメモリです。
質問:
- 上記のコードでは、
a
実際には何を指しているでしょうか? - 「要素のない配列を割り当てる」とはどういう意味ですか?
- 要素がゼロの配列を割り当てることは、実際にどのような用途に使用されますか?