Рассмотрим этот С++ 11 фрагмент кода:
#include <iostream>
#include <set>
#include <stdexcept>
#include <initializer_list>
int main(int argc, char ** argv)
{
enum Switch {
Switch_1,
Switch_2,
Switch_3,
Switch_XXXX,
};
int foo_1 = 1;
int foo_2 = 2;
int foo_3 = 3;
int foo_4 = 4;
int foo_5 = 5;
int foo_6 = 6;
int foo_7 = 7;
auto get_foos = [=] (Switch ss) -> std::initializer_list<int> {
switch (ss) {
case Switch_1:
return {foo_1, foo_2, foo_3};
case Switch_2:
return {foo_4, foo_5};
case Switch_3:
return {foo_6, foo_7};
default:
throw std::logic_error("invalid switch");
}
};
std::set<int> foos = get_foos(Switch_1);
for (auto && foo : foos) {
std::cout << foo << " ";
}
std::cout << std::endl;
return 0;
}
Какой бы компилятор я ни старался, все, похоже, неправильно обрабатывают его. Это заставляет меня думать, что я делаю что-то неправильно, а не обычную ошибку для нескольких компиляторов.
clang 3.5 вывод:
-1078533848 -1078533752 134518134
gcc 4.8.2 вывод:
-1078845996 -1078845984 3
gcc 4.8.3 вывод (скомпилирован на http://www.tutorialspoint.com):
1 2 267998238
gcc (неизвестная версия) вывод (скомпилирован на http://coliru.stacked-crooked.com)
-1785083736 0 6297428
Проблема, по-видимому, вызвана использованием std::initializer_list<int>
в качестве возвращаемого значения лямбда. При изменении лямбда-определения до [=] (Switch ss) -> std::set<int> {...}
возвращаемые значения верны.
Пожалуйста, помогите мне решить эту тайну.