2016-10-20 5 views
1

int *a = new(__FILE__, __LINE__) int;コールは、void* operator new(size_t , const char *, unsigned int);関数を呼び出すことができます。「new」という呼び出しは、ユーザー定義の配置割り当て関数をどのように呼び出しますか?

どのように動作しますか?

+2

を求めています。式 'new(__ FILE__、__LINE__)int'は内部的に' :: operator new'関数を対応するパラメータのリストで解決しようとします。 – AnT

+0

[新しい表現](http://en.cppreference.com/w/cpp/language/new) – Bumzy

答えて

4

C++のすべての演算子には、特定の構文と意味の必要条件があり、それらは過負荷の後でも尊重されなければなりません。例えば。キャレット^演算子にpowerを表すようにオーバーロードしても、代数では大文字になるような乗算*よりも高い優先順位を持つことは期待できません。

newオペレータの構文要件は次のとおりです。

だから、
new (arguments ... /*for specialized case*/) Type (initializer list); 
new (arguments ... /*for specialized case*/) Type [size_t]; 

void* operator new (std::size_t count, void* ptr); 1は、次のコード記述する必要があります使用することができるようにします。

int main() 
{ 
    char arr[sizeof(int)]; 
    int *a = new(arr) int; 
} 

void* operator new (std::size_t count);は、グリッジなしで呼び出すことができます。

int main() 
{ 
    int *a = new int; 
} 

だから、(それが自動的に型から推論)最初のものを除くすべての引数は、newtypeとの間に配置されるべきであり、parenthesisで囲まなければなりません。

だから、あなたの例int *a = new(__FILE__, __LINE__) int;では、の構文規則は、あなたがそれを述べたようにそれは文字通り作品...あのoperator new(std::size_t count, char const *, int)

関連する問題