2013-09-27 124 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' 
} 

Tôi nghĩ (a. ~ A(), & a) là biểu thức hợp lệ có thể được đánh giá thành giá trị con trỏ, vì vậy nó phải được chấp nhận làm đối số vị trí, tại sao kết quả lại không như vậy?Tại sao biểu thức dấu phẩy không hoạt động như mong đợi khi được sử dụng làm đối số vị trí?

Trình biên dịch của tôi là VC++ 2013 RC. Đây có phải là lỗi trình biên dịch không?

Cập nhật:

Tôi đã về Hội một lỗi để connect.microsoft.com

+0

Trông giống như một lỗi đối với tôi. –

Trả lời

3

Vâng, đó là một lỗi biên dịch, cú pháp là đúng.

Bạn có thể nhìn vào ngữ pháp trong tiêu chuẩn:

new-placement: 
(expression-list) 

Và, a.~A(), &a có giá trị như là một biểu-list.

+0

Tôi nghĩ rằng bạn hiểu lầm những gì đang xảy ra. 'New' đang nhận một đối số đơn: hai biểu thức được phân tách bởi toán tử dấu phẩy và được bao quanh bởi dấu ngoặc đơn. Tuy nhiên, không chấp nhận nó vẫn là một lỗi trình biên dịch. (Tôi không chắc chắn về tính hợp lệ của việc lấy địa chỉ của một đối tượng đã chết.) – CTMacUser

+0

@CTMacUser: lấy địa chỉ của một đối tượng đã chết hoặc chưa được xây dựng là hợp lệ, mặc dù các hoạt động bạn có thể làm với một địa chỉ như vậy là rất hạn chế vì bất kỳ nỗ lực nào để dereference nó là hành vi không xác định. –

+0

@CTMacUser: Có, đó là cách toán tử dấu phẩy hoạt động, nhưng nó không hoạt động như một lỗi cú pháp, do đó nó không đánh giá các toán hạng. –