cpp
1template<typename Container> 2auto&& SelectElementry(Container&& c) { 3 std::uniform_int_distribution<std::size_t> rand(0, c.size() - 1); 4 return c[rand(Random::GetEngine())]; 5}
https://wandbox.org/permlink/9ugVJDqZCzhXL27V
のような関数があったときに、戻り値の型について疑問があります。
cpp
1int main() { 2 const std::vector<int> a = { 2, 6, 8 }; 3 std::vector<int> b { 1, 1, 2 }; 4 static_assert(std::is_same_v<const int&, decltype(SelectElementry(a))>); 5 static_assert(std::is_same_v<int&, decltype(SelectElementry(b))>); 6 std::cout << SelectElementry(a) << "," << SelectElementry(b) << std::endl; 7}
のように戻り値の型を確認していたのですが、SelectElementry
の戻り値指定が
auto&
auto&&
decltype(auto)
でまったく同じであることが確認できました。
質問のタイトルに書いたようなキーワードが関連していそうなことは察しがついたので
C++のつまずきポイント解説 その1#テンプレート型推論規則
を読んでみたのですが、いまいちどういう原理で型推論されるのか理解できませんでした。どうなっているのか教えてください。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。