1

テンプレートを使用しないため、次のコードで SFINAE エラーが発生します。結果として、引数を完全に転送しようとしています。どんなアイデアでも。

#include <iostream>

#include "constants.h"


namespace perfectforwarding
{
    template<class T, class U>
    constexpr auto maximum(T&& a, U&& b) -> decltype( (a > b) ? std::forward(a) : std::forward(b))
    {
        return (a > b) ? std::forward(a) : std::forward(b);
    }
}



int main(int argc, const char * argv[])
{

    std::cout << "Created count is: " << created_count << std::endl;

    auto const result = perfectforwarding::maximum(5,6.0);

    std::cout << "The maximum of 5 and 6: " << result << std::endl;
    return 0;
}

ブレア

4

1 に答える 1

6

std::forwardはテンプレートであり、適切に機能させるには、型引数を明示的に指定する必要があります。maximum関数テンプレートを次のように書き換えます。

template<class T, class U>
constexpr auto maximum(T&& a, U&& b) -> 
    decltype( (a > b) ? std::forward<T>(a) : std::forward<U>(b))
{
    return (a > b) ? std::forward<T>(a) : std::forward<U>(b);
}

std::forwardユーティリティの定義方法は次のとおりです。

template<class T> 
T&& forward(typename remove_reference<T>::type& a) noexcept
{
    return static_cast<S&&>(a);
}

typename remove_reference<T>::typeはこれを推定されないコンテキストにします。これにより、型引数を明示的に指定しないと型推定が失敗する理由が説明されますT

于 2013-02-11T13:31:58.593 に答える