Tôi có SSCCE sau:GCC gây segfault cho lambda-bắt gói thông số
#include <iostream>
#include <string>
void foo(const std::string &a) {
std::cout << a << std::endl;
}
template <typename... Args>
void bar(Args &&... args) {
[&]() {
[&]() {
foo(args...);
}();
}();
}
int main() {
const std::string x("Hello World!");
bar(x);
}
Dưới kêu vang ++ (3.9.1) này biên soạn và phát ra "Hello World". Gcc 6.3 không thành công với lỗi phân đoạn theo -O3
.
Tôi có thể khắc phục sự cố bằng cách chuyển con trỏ và gói theo cách rõ ràng, thay thế [&]()
bằng [&args...]()
. Tuy nhiên, cho đến bây giờ, tôi nghĩ rằng [&]
sẽ làm tương tự như liệt kê tất cả các đối số một.
Vậy có gì sai ở đây?
P.S: Điều này không giới hạn ở -O3
. -O0
không phân đoạn nhưng không trả lại kết quả mong đợi ("Hello World!"):
[:~/tmp] $ g++-6 -std=c++1z param.cpp && ./a.out
[:~/tmp] $
P.P.S: Giảm SSCCE. Bây giờ tôi thậm chí không nhận được chẩn đoán với -Wall -Wextra
nữa.
Dường như chỉ xảy ra với tối ưu hóa. – chris
Không thể xác nhận - xảy ra với tôi bằng '-O0' (xem phụ lục) – mrks
@Exagon, Tất nhiên nó có thể được chuyển xung quanh bằng cách tham chiếu. Nó không thể được sao chép, mặc dù. Dưới đây là ví dụ: http://melpon.org/wandbox/permlink/lj4SQhth5iis81FG – chris