GCC вызывает segfault для набора параметров lambda-capture
У меня есть следующий SSCCE:
#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);
}
В соответствии с clang++ (3.9.1) это компилирует и испускает "Hello World". Gcc 6.3 выходит из строя с ошибкой сегментации в -O3
.
Я могу исправить проблему, явно передав указатель и пакет по ссылке, заменив [&]()
на [&args...]()
. Однако до сих пор я думал, что [&]
будет делать то же самое, что перечислять все аргументы один за другим.
Так что здесь происходит не так?
P.S:
Это не ограничивается -O3
. -O0
не выполняет segfault, но не возвращает ожидаемый результат ( "Hello World!" ):
[:~/tmp] $ g++-6 -std=c++1z param.cpp && ./a.out
[:~/tmp] $
P.P.S: Дальнейшее сокращение SSCCE. Теперь я даже не получаю диагностику с -Wall -Wextra
.
Ответы
Ответ 1
Я сильно подозреваю ошибку g++.
Вот несколько примечаний:
ошибка внутреннего компилятора: в make_decl_rtl, в varasm.c: 1304
...
Пожалуйста, отправьте полный отчет об ошибке с предварительно обработанным источником, если это необходимо.
Пожалуйста, включите полную обратную трассировку с любым сообщением об ошибке. Видеть http://gcc.gnu.org/bugs.html.