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ó?
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
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
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