【发布时间】:2017-12-20 10:12:55
【问题描述】:
我有以下 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...]()。但是,到目前为止,我认为[&] 的作用与将所有参数一一列出一样。
那么这里出了什么问题?
附注:
这不仅限于-O3。 -O0 没有段错误但没有返回预期的结果(“Hello World!”):
[:~/tmp] $ g++-6 -std=c++1z param.cpp && ./a.out
[:~/tmp] $
P.P.S:进一步降低 SSCCE。现在我什至没有得到-Wall -Wextra 的诊断信息。
【问题讨论】:
-
似乎只发生在优化中。
-
无法确认 - 我也遇到了
-O0(见附录) -
@Exagon,当然可以通过引用传递。但是,它不能被复制。这是一个示例:melpon.org/wandbox/permlink/lj4SQhth5iis81FG
-
@mrks 糟糕,我注意到缺少段错误,但忘记了它应该产生输出。
-
更新示例,与
unique_ptr无关。