template<class T>void f(Para para)の分類
関数f(Para)にXを渡したときのTの型
\ 関数
\
渡す型X
f(T) f(T&) f(const T&) f(T&& para)
T=
para
T&
=para
const T&
=para
T para
int int int int int& int&
int& int int int int& int&
const int int const int int const
int&
const
int&
const
int&
int const int int const
int&
const
int&
1 int error int int int&&
一覧表
13/22
autoは一つの要素でも初期化リストになる
template関数に直接渡せない
初期化リストの注意点(1/2)
int x1(3); //x1 = 3
int x2{5}; // x2 = 5
auto a1(3); // int a1 = 3;
auto a2{5}; // std::initializer_list<int> a2 = {5};
template<class T> void f(T param);
auto a{1, 2, 3};
f(a); // ok
f({1, 2, 3}); // なぜかerror
template<class T> void f(std::initializer_list<T> param);
f({1, 2, 3}); // これはok
17/22
C++17から変わる(N3922)
auto x = {1}; // 初期化リスト
auto x = {2, 3, 4}; // 初期化リスト
auto x{1}; // int
auto x{2, 3, 4}; // エラー
18.
autoがtemplate型の推論型になるところ
ラムダ関数のauto引数
C++14のreturnのauto
クイズ これは?
初期化リストの注意点(2/2)
auto f(){
return {1, 2}; // error
}
const auto x{2, 3, 4};
auto f = [&](auto x) { return x.size(); }
f(x); // ok
f({1, 2}); // error
18/22
auto x{0xf, 0xffffffff};
auto y{4294967295, 0xffffffff};
C++17から変わる(N3922)
const auto x = {1}; // 初期化リスト
const auto x = {2, 3, 4}; // 初期化リスト
const auto x{1}; // int
const auto x{2, 3, 4}; // エラー
19.
autoを使うと無駄なコピーが発生するかも
std::vector<int> v =vs[i]; とコピー
forとautoの組み合わせの注意点(1/4)
std::vector<std::vector<int>> vs;
for (auto v : vs) { ... }
std::vector<std::vector<int>> vs;
for (auto& v : vs) { ... } // 値を変更するとき
for (const auto& v : vs { ... } // 値をいじらないとき
19/22