質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

960閲覧

ユニバーサル参照の使い方について

jbe00214

総合スコア63

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/06/20 02:32

前提・実現したいこと

テンプレトート引数が単純であれば通常のユニバーサル参照を引数にする関数は作れるのですが,テンプレートテンプレート仮引数の場合にうまく作れません。以下のコードでは,func1では,arrayをまるごと推論しており,右辺値も左辺値も受け取れますが,func2では右辺値しか受け取れません。fanc2をどのように修正すればよいのでしょうか。お知恵をください。

該当のソースコード

C++

1template<typename T> 2void func1(T&& x){ 3 ///do something 4} 5template<typename T,size_t N,template<typename,size_t>class M> 6void func2(M<T,N>&& x){ 7 ///do something 8} 9int main(){ 10 array<int,3> m{1,2,3}; 11 func1(m); 12 func2(m);//No matching function for call to 'func2' 13}

補足情報(FW/ツールのバージョンなど)

clang
c++17

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

そもそもFowarding Reference(Universal Reference)とは、func1でやられているように、template仮引数に対して(あるいはautoに対して)&&をつけた時の特殊な振る舞いについてを指します。

func2ではそのようになっていませんのでこれは単なるrvalue referenceです。

こういうケースでは無理やりFowarding Referenceを使おうなどと考えずに、単にoverloadを追加することでうまくいくと思います。どうしてもFowarding Referenceでとなると、template側でconceptないしSFINAEで制約することになりますが、大抵のケースで面倒なだけです。

https://onihusube.hatenablog.com/entry/2020/07/12/230540

投稿2021/06/20 04:30

yumetodo

総合スコア5852

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbe00214

2021/06/20 05:00

いつも,どうも。 そうですか... 言語仕様としは無理ということですね。
yumetodo

2021/06/20 05:48

無理ではないですがoverloadするほうが大抵のケースで楽だしわかりやすいということです。
yohhoy

2021/06/24 05:13 編集

FYI: 例えば書籍「Effective Modern C++ (https://www.oreilly.co.jp/books/9784873117362/ )」でも、ユニバーサル参照とオーバーロードの併用について注意喚起していますね。 項目26:ユニヴァーサル参照をとるオーバロードは避ける 項目27:ユニヴァーサル参照をとるオーバロードの代替策を把握する
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問