我有以下SSCCE:GCC導致段錯誤的λ-拍攝參數包
#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);
}
在鐺++(3.9.1)這個編譯併發出的 「Hello World」。 Gcc 6.3在-O3
下發生分段錯誤。
我可以通過明確地傳遞指針和包裝來解決問題,用[&args...]()
代替[&]()
。但是,到現在爲止,我認爲[&]
將會像逐個列出所有參數一樣。
那麼,什麼是走錯了嗎?
P.S: 這不限於-O3
。 -O0
不段錯誤,但不會返回預期的結果(的 「Hello World!」):
[:~/tmp] $ g++-6 -std=c++1z param.cpp && ./a.out
[:~/tmp] $
P.P.S:進一步降低SSCCE。現在我甚至不會再用-Wall -Wextra
進行診斷。
似乎只與優化發生。 – chris
無法確認 - 同樣發生在'-O0'上(參見附錄) – mrks
@Exagon,當然可以通過引用來傳遞。但它不能被複制。這裏有一個例子:http://melpon.org/wandbox/permlink/lj4SQhth5iis81FG – chris