2015-02-05 19 views
7

Những gì tôi đang cố gắng để đạt được chủ yếu là trả lại một struct giấu tên từ một hàm trong C++ 11. Trong C++ 14, tôi có thể làm điều này bằng cách định nghĩa hàm nội tuyến và có auto như kiểu trả về, như thế này:Tại sao cấu trúc có thể không được xác định trong khai báo hàm trong C++ 11 hoặc cao hơn?

auto func() 
{ 
    struct 
    { 
     int member; 
    } ret; 

    // set ret.member 

    return ret; 
} 

Tuy nhiên, C++ 11 không hỗ trợ suy ra như kiểu trả về của một bình thường (không phải lambda) chức năng, và điều này chỉ hoạt động trong C++ 14 khi định nghĩa được thực hiện nội tuyến.

tôi đã cố gắng hai biến thể sau tuyên bố struct trong phần khai báo hàm:

auto func() -> struct { int member; }; 
struct { int member; } func(); 

Đây có phải là chỉ đơn giản là không thể làm với C++ 11? Nếu vậy, không ai biết liệu điều này đã không được phép vào mục đích hay chỉ là không ai nghĩ đến việc sử dụng mới này sẽ tự động loại suy (vì đây chỉ hoạt động với các chức năng trả lại giá trị được gán cho một biến auto)?

Và cuối cùng, là có cách nào khác để đạt được một cái gì đó tương tự như này? Tôi biết về std::tuple, nhưng tôi muốn đặt tên cho các giá trị; và trong trường hợp sử dụng của tôi, kiểu cấu trúc chắc chắn chỉ hữu ích như kiểu trả về của hàm này, vậy tại sao lại đặt tên cho nó?

+2

Nó không được không được phép vào mục đích; nó chỉ đơn giản là chưa được thiết kế, và ủy ban đã cảnh giác với việc thực hiện quá nhiều đặc điểm kỹ thuật xung quanh 'auto' mà không có kinh nghiệm thực tế. Hãy nhớ các fiascos của các đặc tả 'throw' hoặc các mẫu bên ngoài. Và hãy nhớ rằng C++ 11 đã được phát hành tốt trước năm 2009 vì vậy họ đã khá muộn. – rodrigo

+1

C++ 11 và 14 được coi là một giao dịch trọn gói hơn. Sau này là sự hoàn thành của cựu theo nhiều cách. Vì vậy, nó là nhiều hơn một trường hợp của các chức năng bạn muốn không làm cho nó vào nửa đầu tiên của triển khai. – qeadz

+0

Không được phép trong đặc tả mặc dù, hoặc nên 'struct {int member; } 'là một kiểu trả về hợp lệ cho một hàm (nói chung, không chỉ trong C++ 11 và cao hơn), và các nhà phát triển trình biên dịch không nghĩ đến khả năng này (vì nó là vô dụng trước C++ 11)? – jPlatte

Trả lời

4

[dcl.fct]/P11:

loại sẽ không được định nghĩa lại hoặc tham số loại.

Điều này không mới trong C++ 11, theo như tôi biết.

2

A lớp-specifier bao gồm tên đầu lớp{ }. Khi gặp phải dấu ngoặc đóng, lớp được xác định. Nếu đẳng cấp đầu tên được bỏ qua, đó là lớp vô danh (§9). Một type-specifier có thể có một đẳng cấp specifier, nhưng dấu-type-specifier không thể (chỉ đơn giản-type-specifier, xây dựng-type-specifier, typename-specifiercv-qualifier được cho phép, §7.1.6). Vì lý do này, tôi tin rằng nó không thể đưa định nghĩa của một lớp trong một dấu-trở-type.

Nguồn: N4140

+0

Tôi không thể tìm thấy tài liệu N4140, chỉ có một tham chiếu đến N4296 mà dường như là một phiên bản sửa đổi của cùng một tài liệu (tài liệu thứ tư [ở đây] (http://meetingcpp.com/index.php/cpp-proposals-by -mailing-and-subgroup-for-2014.html # mailing2014-11-)). Bạn có thể xem xét điều đó và chỉ ra nơi những thứ liên quan được xác định? – jPlatte

+0

@jP_wanN ​​Tải xuống từ [github] (https://github.com/cplusplus/draft/blob/master/papers/n4140.pdf) –

+0

remyabel: Cảm ơn, tôi sẽ xem xét nó! – jPlatte

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