Mam następujący SSCCE:GCC powoduje segfault dla lambda-schwytany parametrów paczki
#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);
}
Zgodnie z brzękiem ++ (3.9.1) to kompiluje i emituje "Hello World". Gcc 6.3 kończy się niepowodzeniem z błędem segmentacji pod numerem -O3
.
Mogę naprawić problem, jawnie przekazując wskaźnik i pakiet przez odniesienie, zastępując [&]()
z [&args...]()
. Jednak do tej pory myślałem, że [&]
zrobi to samo, co lista wszystkich argumentów po kolei.
Co tu jest nie tak?
P.S: Nie jest to ograniczone do -O3
. -O0
nie wysypać ale nie zwraca oczekiwanego rezultatu ("Hello World!"):
[:~/tmp] $ g++-6 -std=c++1z param.cpp && ./a.out
[:~/tmp] $
P.P.S: dalszemu ograniczeniu SSCCE. Teraz nie otrzymuję już diagnostyki z -Wall -Wextra
.
Wydaje się, że dzieje się to wyłącznie z optymalizacją. – chris
Nie mogę potwierdzić - dzieje się dla mnie również z '-O0' (patrz addendum) – mrks
@Exagon, Oczywiście można go przekazać przez odniesienie. Nie można go jednak skopiować. Oto przykład: http://melpon.org/wandbox/permlink/lj4SQhth5iis81FG – chris