2010-09-07 27 views
7

$ 4,2/1 - "Một giá trị trái hoặc rvalue loại ‘mảng ofN T’hoặc‘mảng không rõ ràng buộc của T’có thể được chuyển đổi thành một rvalue kiểu‘con trỏ tới T.’ Kết quả là con trỏ đến phần tử đầu tiên của mảng. "Array và rvalue

Tôi không chắc chắn làm thế nào để chúng tôi nhận được giá trị của một loại mảng khác với trong quá trình khởi tạo/khai báo?

+1

bản sao có thể có của [Tôi nghĩ rằng tôi có thể đã đưa ra ví dụ về giá trị rvalue của loại mảng] (http://stackoverflow.com/questions/4058151/i-think-i-may-have-come-up- with-an-example-of-rvalue-of-array-type) –

Trả lời

-2

Bạn không thể nhận được giá trị của loại mảng. Mảng chỉ có thể là các giá trị và bất cứ khi nào chúng được sử dụng trong một giá trị, chúng phân rã thành con trỏ đến phần tử đầu tiên.

int array[10]; 
int * p = array; // [1] 

Khái niệm array trong [1] là một vế trái của loại int (&)[10] đó được chuyển đổi sang một rvalue loại int *p, có nghĩa là, các mảng rvalue của N == 10 == T int được chuyển thành một giá trị của loại con trỏ tới T == int.

+0

Bạn có thể vui lòng chỉ cho tôi một ví dụ trong đó báo giá trên có tốt cho loại Rvalue of Array không? – Chubsdad

+0

Đó có phải là lý do tại sao các hàm không thể trả về các kiểu mảng? –

+0

@Cedric H .: Trong §8.3.5 [dcl.fct]/3 tiêu chuẩn xác định rằng * Sau khi xác định loại của mỗi tham số, bất kỳ tham số nào của kiểu “mảng T” hoặc “hàm trả về T” được điều chỉnh là "Con trỏ tới T" hoặc "con trỏ tới hàm trả về T," tương ứng. * Tức là, tiêu chuẩn xác định rằng 'void foo (char [10])' là một khai báo chính xác tương đương với 'void foo (char \ *)' - - đó là đối số. Sau đó, trong §8.3.5/6 nó nói: * Hàm sẽ không có kiểu trả về của mảng hoặc hàm kiểu, mặc dù chúng có thể có kiểu trả về kiểu con trỏ hoặc tham chiếu đến những thứ như vậy *. đối với các loại trả lại –

-2

Đây có phải là cơ hội để chứng minh Array Rvalue không?

int main(){ 
int buf[10][10]; 

int (*p)[10] = buf; 

int (*p2)[10] = p;  // LValue to Rvalue conversion of Array type 'p' 
} 
+2

Nope ... p không phải là loại mảng ... nó là một con trỏ tới một mảng. –

10

Tôi không chắc chắn những gì bạn đề cập đến bằng cách "khởi tạo/khai báo" trong ngữ cảnh này. Trong phần tiếp theo, mảng là một prvalue

template<typename T> using alias = T; 

int main() { return alias<int[]>{1, 2, 3}[0]; } 

này có thể được xác nhận qua decltype(alias<int[]>{1, 2, 3}) có loại int[3]. Tạo mảng theo cách này trên bay không được dự định ban đầu để làm việc nhưng trượt vào bản thảo làm việc bằng cách của công việc liên quan đến khởi tạo thống nhất. Khi tôi nhận ra rằng một số đoạn trong bản thảo làm việc C++ 0x không cho phép một số trường hợp đặc biệt của việc tạo ra tạm thời các mảng tạm thời trong khi các đoạn khác cho phép nó, tôi đã gửi một báo cáo lỗi tới ủy ban C++, sau đó trên cơ sở thực hiện một phần công việc của GCC đã quyết định hỗ trợ đầy đủ điều này.

+0

Để cụ thể hơn, trong từ ngữ hiện tại, 'f(). Array' là một xvalue không? Những gì tôi nghĩ rằng nó là không thể có được là một prvalue mảng, phải không? –

+1

@ Peregring-lk có nó là một xvalue bây giờ (không phải tại thời điểm câu trả lời). Và trong 'alias {1, 2, 3}' biểu thức là cả xvalue và giá trị.Đầu tiên, nó là một giá trị không có đối tượng liên quan, và khi bạn chỉ mục vào nó, "chuyển đổi vật chất" tạo một đối tượng cho nó và cung cấp biểu thức giá trị "xvalue", trước khi lấy con trỏ đến phần tử đầu tiên của mảng. –

Các vấn đề liên quan