期待される関数が呼び出されないのはなぜですか?型の特徴を間違って理解していますか?

fengqi

私は型特性の概念を学ぼうとしています。そして、私は自分の理解をテストするためにいくつかのコードを書きました:

#include <iostream>
#include <typeinfo>
#include <utility>

class Normal1 {};
class Normal2 {};
class Special {};

struct Normal_tag {};
struct Special_tag {};

template <typename T>
struct trait {
    typedef Normal_tag Type;
};

template <>
struct trait<Special> {
    typedef Special_tag Type;
};

template <typename T>
void handle_impl(T&& object, Normal_tag) {
    std::cout << "normal called\n";
}

template <typename T>
void handle_impl(T&& object, Special_tag) {
    std::cout << "special called\n";
}

// method 1: can't pass in rvalue
// template <typename T>
// void handle(T& object) {
//     handle_impl(object, typename trait<T>::Type());
//     std::cout << '\t' << typeid(T).name()                       << '\n'
//               << '\t' << typeid(typename trait<T>::Type).name() << '\n';
// }

// method 2: always lvalue
// template <typename T>
// void handle(const T& object) {
//     handle_impl(object, typename trait<T>::Type());
//     std::cout << '\t' << typeid(T).name()                       << '\n'
//               << '\t' << typeid(typename trait<T>::Type).name() << '\n';
// }

// method 3: try to use universal reference
template <typename T>
void handle(T&& object) {
    // handle_impl(object, typename trait<T>::Type());
    handle_impl(std::forward<T>(object), typename trait<T>::Type());
    std::cout << '\t' << typeid(T).name()                       << '\n'
              << '\t' << typeid(typename trait<T>::Type).name() << '\n';
}

int main(int argc, char *argv[])
{
    Normal1 n1;
    Normal2 n2;
    Special sp;

    handle(sp);                 // This line
    handle(n1);
    handle(n2);

    handle(Special());
    handle(Normal1());
    handle(Normal2());

    return 0;
}

以下の出力は私が期待したものではありません。lvalue引数とrvalue引数の両方に対して特別なメソッドを呼び出す必要があります。

normal called
        7Special
        10Normal_tag
normal called
        7Normal1
        10Normal_tag
normal called
        7Normal2
        10Normal_tag
special called
        7Special
        11Special_tag
normal called
        7Normal1
        10Normal_tag
normal called
        7Normal2
        10Normal_tag

出力は、クラスSpecialがインスタンス化に使用されることを意味すると思います。しかし、なぜ私は得るのNormal_tagですか?通話がhandle(sp);このように動作するのはなぜですか?

ユニバーサルリファレンスが左辺値と右辺値の両方の引数を処理することを望んでいましたが、これは悪い方法ですか?

rafix07

handle(sp); spを呼び出すと、L値であるため、handleテンプレートでTは次のように推定されますSpecial&が、特殊化はありません。Special&

template <>
struct trait<Special&> {
   typedef Special_tag Type;
};

したがって、出力として呼び出される法線を取得しました

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

関数が呼び出された変数参照を変更するのは間違っていますか?

分類Dev

手動ビュー包含を使用しているときに、viewWillDisappearが間違ったタイミングで呼び出されるのはなぜですか?

分類Dev

呼び出しメソッドを呼び出すと「引数の数が間違っています」例外が発生するのはなぜですか(JAVA)

分類Dev

関数定義でまだ定義されていない関数を呼び出すと、PythonがNameErrorをスローしないのはなぜですか

分類Dev

これらのprint()呼び出しが間違った順序で実行されているように見えるのはなぜですか?

分類Dev

論理演算子を介して呼び出される関数で「これ」が定義されていないのはなぜですか?

分類Dev

JavaScript関数が呼び出されていないように見えるのはなぜですか?

分類Dev

なぜPythonは引数の数が間違っている関数呼び出しを許可するのですか?

分類Dev

JSは、関数を呼び出すか呼び出さないかによって異なる反応を示します(google maps apiが使用されます)

分類Dev

map()呼び出しが期待される結果を返さないのはなぜですか?

分類Dev

関数呼び出しで何も変更されていないのに、なぜ関数は2つの異なる値を返すのですか?

分類Dev

externを使用しているときに、間違ったシグネチャで関数を呼び出すことができるのはなぜですか?

分類Dev

この(予期しない)型が高階関数によって返されるのはなぜですか?

分類Dev

Rで呼び出されるdbetaの関数はどのようになっていますか

分類Dev

マルチプロセッシングによって呼び出された関数がメッセージを出力しないのはなぜですか?

分類Dev

このプログラム内で想定されているように関数呼び出しが実行されないのはなぜですか?

分類Dev

値によって関数に渡されたときと別のコンストラクターに値によって渡されたときのコンストラクターの呼び出しに違いがあるのはなぜですか?

分類Dev

F#関数を定義しているが呼び出していないのに、関数はまだ呼び出されているようです

分類Dev

PHP:関数呼び出しで参照を使用しているときに配列が変更されないのはなぜですか?

分類Dev

この関数がパラメーターとして呼び出されない変数に適用されるのはなぜですか?

分類Dev

Robolectricを使用しているときにPopupWindow.OnDismissListenerが呼び出されないのはなぜですか?

分類Dev

関数を呼び出せなくても、関数呼び出しの引数部分の式が評価されるのはなぜですか?

分類Dev

解析関数が期待されるすべてのトークンを返さないのはなぜですか?

分類Dev

この関数が呼び出されないのはなぜですか?

分類Dev

ipywidgetボタンによって呼び出されたmy関数が出力を返さないのはなぜですか?

分類Dev

引数のない関数呼び出しがより速く実行されるのはなぜですか?

分類Dev

WindowsのJulia(0.6.2)から呼び出されたFortran関数の結果が間違っています

分類Dev

Tensorflow 2.0コードを実行すると、「ValueError:tf.function-decorated関数が最初の呼び出し以外で変数を作成しようとしました」が表示されます。私は何が間違っているのですか?

分類Dev

SetIntervalで関数が呼び出されないのはなぜですか?

Related 関連記事

  1. 1

    関数が呼び出された変数参照を変更するのは間違っていますか?

  2. 2

    手動ビュー包含を使用しているときに、viewWillDisappearが間違ったタイミングで呼び出されるのはなぜですか?

  3. 3

    呼び出しメソッドを呼び出すと「引数の数が間違っています」例外が発生するのはなぜですか(JAVA)

  4. 4

    関数定義でまだ定義されていない関数を呼び出すと、PythonがNameErrorをスローしないのはなぜですか

  5. 5

    これらのprint()呼び出しが間違った順序で実行されているように見えるのはなぜですか?

  6. 6

    論理演算子を介して呼び出される関数で「これ」が定義されていないのはなぜですか?

  7. 7

    JavaScript関数が呼び出されていないように見えるのはなぜですか?

  8. 8

    なぜPythonは引数の数が間違っている関数呼び出しを許可するのですか?

  9. 9

    JSは、関数を呼び出すか呼び出さないかによって異なる反応を示します(google maps apiが使用されます)

  10. 10

    map()呼び出しが期待される結果を返さないのはなぜですか?

  11. 11

    関数呼び出しで何も変更されていないのに、なぜ関数は2つの異なる値を返すのですか?

  12. 12

    externを使用しているときに、間違ったシグネチャで関数を呼び出すことができるのはなぜですか?

  13. 13

    この(予期しない)型が高階関数によって返されるのはなぜですか?

  14. 14

    Rで呼び出されるdbetaの関数はどのようになっていますか

  15. 15

    マルチプロセッシングによって呼び出された関数がメッセージを出力しないのはなぜですか?

  16. 16

    このプログラム内で想定されているように関数呼び出しが実行されないのはなぜですか?

  17. 17

    値によって関数に渡されたときと別のコンストラクターに値によって渡されたときのコンストラクターの呼び出しに違いがあるのはなぜですか?

  18. 18

    F#関数を定義しているが呼び出していないのに、関数はまだ呼び出されているようです

  19. 19

    PHP:関数呼び出しで参照を使用しているときに配列が変更されないのはなぜですか?

  20. 20

    この関数がパラメーターとして呼び出されない変数に適用されるのはなぜですか?

  21. 21

    Robolectricを使用しているときにPopupWindow.OnDismissListenerが呼び出されないのはなぜですか?

  22. 22

    関数を呼び出せなくても、関数呼び出しの引数部分の式が評価されるのはなぜですか?

  23. 23

    解析関数が期待されるすべてのトークンを返さないのはなぜですか?

  24. 24

    この関数が呼び出されないのはなぜですか?

  25. 25

    ipywidgetボタンによって呼び出されたmy関数が出力を返さないのはなぜですか?

  26. 26

    引数のない関数呼び出しがより速く実行されるのはなぜですか?

  27. 27

    WindowsのJulia(0.6.2)から呼び出されたFortran関数の結果が間違っています

  28. 28

    Tensorflow 2.0コードを実行すると、「ValueError:tf.function-decorated関数が最初の呼び出し以外で変数を作成しようとしました」が表示されます。私は何が間違っているのですか?

  29. 29

    SetIntervalで関数が呼び出されないのはなぜですか?

ホットタグ

アーカイブ