3

カバーの下にポインターを使用して「参照」を保存するように、次のコードで同様std::reference_wrapperのことをしようとしています。

#include <type_traits>

struct Foo
{
    void* _ptr;

    template<typename T>
    Foo(T val,
        typename std::enable_if
            <
                std::is_reference<T>::value,
                void
            >::type* = nullptr)
        : _ptr(&val)
    { }
};

int main()
{
    int i = 0;
    int& l = i;

    Foo u2(l);

    return 0;
}

ただし、これはコンパイルに失敗します。

CXX main.cpp
main.cpp: In function ‘int main()’:
main.cpp:23:13: error: no matching function for call to ‘Foo::Foo(int&)’
main.cpp:23:13: note: candidates are:
main.cpp:8:5: note: template<class T> Foo::Foo(T, typename std::enable_if<std::is_reference<_Tp>::value, void>::type*)
main.cpp:8:5: note:   template argument deduction/substitution failed:
main.cpp: In substitution of ‘template<class T> Foo::Foo(T, typename std::enable_if<std::is_reference<_Tp>::value, void>::type*) [with T = int]’:
main.cpp:23:13:   required from here
main.cpp:8:5: error: no type named ‘type’ in ‘struct std::enable_if<false, void>’
main.cpp:3:8: note: constexpr Foo::Foo(const Foo&)
main.cpp:3:8: note:   no known conversion for argument 1 from ‘int’ to ‘const Foo&’
main.cpp:3:8: note: constexpr Foo::Foo(Foo&&)
main.cpp:3:8: note:   no known conversion for argument 1 from ‘int’ to ‘Foo&&’

enable_if参照パラメーターの戻り値を trueにするにはどうすればよいですか?

4

1 に答える 1

5

Tこの場合、参照型であると推定されることはありません。オブジェクトの構築ではu2、コンストラクタ テンプレート引数は と推定されますint

変数の型は ですu2int&、式で使用する u2と、型の左辺値式になりintます。 式には参照型がありません。

テンプレートの引数推定では、関数の引数の型を使用して、テンプレート パラメーターの型を推定します。関数の引数は式です。したがって、参照型を持つ式がないため、テンプレート引数が参照型であると推定されることはありません。

[C++11 では、関数の引数に型T&&がある場合、引数が左辺値の場合、T型に推定されることがあります。T&このメカニズムにより、完全な転送が可能になります。ただし、それはあなたのシナリオとは関係ありません。]

実際、式では、オブジェクトとそのオブジェクトへの参照は区別できません。参照を使用すると、オブジェクトに別の名前を付けることができます。

于 2012-06-06T03:30:23.393 に答える