読者です 読者をやめる 読者になる 読者になる

とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

initializer_list がよく分からない

C++

後で調べないと…。

#include<initializer_list>

namespace sscrisk{

 template<class T>
 std::initializer_list<T> il(std::initializer_list<T> list){ return list; }

}


#include<type_traits>
#include<utility>

namespace bad{

 template<class... Types>
 std::initializer_list<typename std::common_type<Types...>::type> il(Types&&... args)
 {
  return {std::forward<Types>(args)...};
 }

}


#include<iostream>

int main()
{
 {
  std::initializer_list<int> list = sscrisk::il({0, 1, 2});
  for(int const i: list)
  {
   std::cout << i << std::endl;
  }
 }

 {
  std::initializer_list<int> list = bad::il(0, 1, 2);
  for(int const i: list)
  {
   std::cout << i << std::endl;
  }
 }
}

実行結果:

0
1
2
2293364
2293336
4694124

bad::il の結果が直感と違う。list が変なところを指してるか,寿命が切れてるオブジェクトを指してる???意味不明…。