J'ai le SSCCE suivant :
#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);
}
Sous clang++ (3.9.1), cela compile et émet "Hello World". Gcc 6.3 échoue avec une erreur de segmentation sous -O3
.
Je peux résoudre le problème en passant explicitement le pointeur et le pack par référence, en remplaçant [&]()
avec [&args...]()
. Cependant, jusqu'à présent, je pensais que [&]
ferait la même chose que de lister tous les arguments un par un.
Alors, qu'est-ce qui ne va pas ici ?
P.S : Ceci n'est pas limité à -O3
. -O0
n'est pas en défaut mais ne renvoie pas le résultat attendu ("Hello World !") :
[:~/tmp] $ g++-6 -std=c++1z param.cpp && ./a.out
[:~/tmp] $
P.P.S : Le SSCCE a encore été réduit. Maintenant, je n'obtiens même pas un diagnostic avec -Wall -Wextra
plus.