2013-09-27 10 views
10
#include <new> 

using namespace std; 

void f(void*) 
{} 

struct A 
{}; 

int main() 
{ 
    A a; 

    f((a.~A(), &a)); // OK 
    new (&a) A(); // OK 

    new ((a.~A(), &a)) A(); // error C2059: syntax error : 'type' 
} 

Myślę, że (a. ~ A(), & a) jest prawidłowym wyrażeniem, które można ocenić na wartość wskaźnika, więc powinno być akceptowane jako argument miejsca docelowego, dlaczego nie jest tak?Dlaczego wyrażenie przecinek nie działa zgodnie z oczekiwaniami, gdy jest używane jako argument miejsca docelowego?

Mój kompilator to VC++ 2013 RC. Czy jest to błąd kompilatora?

Aktualizacja:

Mam summitted błąd do connect.microsoft.com

+0

Wygląda jak błąd. –

Odpowiedz

3

Tak, to jest to błąd kompilatora, składnia jest poprawna.

Możesz zajrzeć gramatyki w standardzie:

new-placement: 
(expression-list) 

I a.~A(), &a jest ważna jako wyraz liście.

+0

Myślę, że źle zrozumiałeś co się dzieje. "Nowy" otrzymuje jeden argument: dwa wyrażenia oddzielone operatorem przecinka i otoczone nawiasami. Nie zaakceptowanie go jest jednak nadal błędem kompilatora. (Nie jestem pewien co do ważności przyjmowania adresu martwego obiektu.) – CTMacUser

+0

@CTMacUser: przyjmowanie adresu martwego lub jeszcze nie skonstruowanego obiektu jest ważne, chociaż operacje, które można wykonać za pomocą takiego adresu, są bardzo ograniczone ponieważ każda próba dereferencji jest niezdefiniowanym zachowaniem. –

+0

@CTMacUser: Tak, działa w ten sposób operator przecinka, ale jego błąd jest błędem składni, więc w ogóle nie ocenia operandów. –

Powiązane problemy