私の知る限り(あるいは、少なくとも私のコンパイラで:gccと打ち鳴らす)、次のコードは許可されている:それは非常にきれいにすることができますので、フォースの暗黙の呼び出し
struct BLA { void *operator new(std::size_t size, int i1, int i2); };
int main(void)
{
struct BLA *bla = new (3,5) BLA;
return 0;
}
イマオが、これは非常にクールです記憶域を割り当てる構文。
この手法では、オブジェクトを非常にクリーンな方法で割り当て、コンストラクタを不正に使用する必要がない方法を表す変数を渡すことができます。
残念ながら、C++標準では、(AFAIK)と同様の方法で 'delete'演算子は機能しないと言います。すなわち:
struct BLA
{
void *operator new(std::size_t size, int i1, int i2);
void operator delete(void *p, int i1, int i2);
};
int main(void)
{
struct BLA *bla = new (3,5) BLA;
delete (3,5) bla;
return 0;
}
は、「削除」行にハードエラーが発生します。
この非標準の暗黙的な呼び出しを許可する方法(多分コンパイラスイッチ)はありますか?
BLA :: operator delete(bla、3、5)?上記の行を使用して
が本当に素敵な構文:(
* "多分コンパイラスイッチ" * - 標準以外のものを求めているときは、使用しているコンパイラを言及する価値があります。個人的には、私はそれが痛みの価値があるようになるような何かを考えていない! – Flexo
私はgccとclangを使っています。個人的に私はスイッチを通過する際の痛みは見られませんが) – iolo
申し訳ありませんが、私は見たときにそこになかったことを誓ったことができました。痛みはスイッチを通過することではなく、それがコミットしたとき(大きなコードベース)に、突然別のコンパイラに切り替えて*すべて*を書き直さなければならなくなります。勝利はそれほど大きくありません(コンストラクタ/デストラクタではできませんし、動機によってはテンプレートのトリッキーなこともあります)。あなたは意図的に異なるものである懸念(メモリの割り当てとメモリの初期化)を混在させています。 – Flexo