Tôi có một lớp tiện ích:Khởi tạo và lambda kiểu lập luận
struct Atreturn
{
std::function<void()> funcdestr;
Atreturn(std::function<void()> fd): funcdestr(fd) {}
~Atreturn() { funcdestr(); }
};
Lưu ý không explicit
thuộc tính tại nhà xây dựng.
có thể sử dụng nên:
trực tiếp khởi tạo constructor gọi:
Atreturn hook ([something]() { DestroySomething(something); });
Copy-khởi tạo constructor gọi:
Atreturn hook = [something]() { DestroySomething(something); };
Direct-list-khởi tạo cuộc gọi constructor:
Atreturn hook { [something]() { DestroySomething(something); }};
Bây giờ câu hỏi: kiến thức tốt nhất của tôi, phương pháp # 1 và # 2 nên được cho phép vì họ là về mặt lý thuyết điều tương tự, với điều kiện là không có explicit
tại các nhà xây dựng, trong khi # 3 không nên được cho phép bởi vì cú pháp này ngăn chặn chuyển đổi (ít nhất nó là như vậy cho int
nếu bạn đã cố gắng int{2.1}
).
Tuy nhiên, gcc 4.9 cho phép phương pháp # 1 và # 3, nhưng không cho phép # 2 (và nói conversion from '...::<lambda()>' to non-scalar 'Atreturn' type requested
). Điều này nghe có vẻ điên rồ bởi vì nó thường xảy ra chỉ khi bạn có một nhà xây dựng explicit
. Ai có thể giải thích, tại sao?
Ngoài ra, hãy để tôi làm cho vấn đề này rõ ràng hơn: Tôi cần một số cú pháp không quá vụng về để khởi tạo đối tượng Atreturn này, ít nhất là không cần thêm dấu ngoặc đơn hoặc dấu ngoặc đơn. Vấn đề là các trình soạn thảo có chức năng tự động thụt lề có vấn đề với sự sắp xếp hợp lý khi đối số là C++ 11 lambda. Vì vậy, tôi cần một số cú pháp có thể được diễn tả như:
Atreturn BLAH BLAH BLAH [something]() { DestroySomething(something); };
(Cũng thêm bản dựng khởi tạo bản sao-danh sách: 'Móc móc Areturn = {...}'?) –
Giống như phương pháp # 3, đây = tùy chọn trong C++ 11. – Ethouris
# 1 và # 2 là * không * giống nhau. Họ sẽ là nếu loại bên phải là 'Atreturn', nhưng nó không phải. – Angew