2012-05-16 29 views
6

Tôi tự hỏi nếu có cách nào để phân biệt các cuộc gọi chức năng (với mảng làm tham số) được hiển thị trong đoạn mã sau:Mảng và Rvalues ​​(như các thông số)

#include <cstring> 
#include <iostream> 

template <size_t Size> 
void foo_array(const char (&data)[Size]) 
{ 
    std::cout << "named\n"; 
} 

template <size_t Size> 
void foo_array(char (&&data)[Size]) //rvalue of arrays? 
{ 
    std::cout << "temporary\n"; 
} 


struct A {}; 

void foo(const A& a) 
{ 
    std::cout << "named\n"; 
} 

void foo(A&& a) 
{ 
    std::cout << "temporary\n"; 
} 


int main(/* int argc, char* argv[] */) 
{ 
    A a; 
    const A a2; 

    foo(a); 
    foo(A());    //Temporary -> OK! 
    foo(a2); 

    //------------------------------------------------------------ 

    char arr[] = "hello"; 
    const char arr2[] = "hello"; 

    foo_array(arr); 
    foo_array("hello");  //How I can differentiate this? 
    foo_array(arr2); 

    return 0; 
} 

Các foo "chức năng gia đình" có khả năng phân biệt đối tượng tạm thời với tên được đặt tên. Không phải là trường hợp của foo_array.

Có thể trong C++ 11 không? Nếu không, bạn có nghĩ là có thể? (rõ ràng là thay đổi tiêu chuẩn)

Trân trọng. Fernando.

+0

Nếu bạn sử dụng 'std :: mảng <> 'thay vì C-mảng thô, đây sẽ là tầm thường. – ildjarn

Trả lời

14

Không có gì sai với foo_array. Đó là trường hợp thử nghiệm xấu: "hello" là một giá trị! Hãy suy nghĩ về nó. Nó không phải là một tạm thời: chuỗi ký tự có thời gian lưu trữ tĩnh.

Một rvalue mảng sẽ là một cái gì đó như thế này:

template <typename T> 
using alias = T; 
// you need this thing because char[23]{} is not valid... 

foo_array(alias<char[23]> {}); 
+1

Đây là một ví dụ tương tự (được hạ cấp xuống để phù hợp với GCC 4.5 giới hạn C++ 11 hỗ trợ) trên ideone: http://ideone.com/lgItR –

+2

Rất đẹp. Có thể một mảng tạm thời phân rã thành một con trỏ không? I E. có phải cái gì đó thực sự có địa chỉ không? –

+0

@KerrekSB câu hỏi thú vị mà tôi sợ tôi không biết câu trả lời (và tôi không có thời gian cho nhiều nghiên cứu ngay bây giờ). Có thể đáng để đăng một câu hỏi mới về nó. –

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