Идеальная функция пересылки вывела конфликтующую ошибку

Я тестирую идеальную пересылку, и я не понимаю, почему TEST_EQ(string("olleH"), s) компиляция не удалась, а string("olleH") == s компиляция прошла. Как мне исправить мою функцию TEST_EQ здесь?

template<typename S>
static bool TEST_EQ(S&& a, S&& b) 
{
    return forward<S>(a) == forward<S>(b);      
}


int main()
{
 string s= "Hello";

 cout << TEST_EQ(string("olleH"), s) << endl;
 cout << (string("olleH") == s);

}

person Bryan Fok    schedule 17.04.2018    source источник


Ответы (2)


В соответствии с правилом вывода ссылка на переадресацию, когда вы пытаетесь позвонить TEST_EQ как TEST_EQ(string("olleH"), s) для аргумента string("olleH"), который является значением r, тогда S будет выводиться как std::string; для аргумента s, который является lvalue, тогда S будет выведено как std::string&. Результат вывода конфликтует, тогда вызов терпит неудачу.

Вы можете добавить еще один параметр шаблона, чтобы избежать конфликта выводов, например.

template<typename S, typename T>
static bool TEST_EQ(S&& a, T&& b) 
{
    // if you need to check that S and T should be the same type
    static_assert(is_same_v<remove_cvref_t<S>, remove_cvref_t<T>>, "S and T must be the same type.");

    return forward<S>(a) == forward<T>(b);      
}

ПРЯМОЙ ЭФИР

person songyuanyao    schedule 17.04.2018
comment
Я не буду предлагать это исправление, потому что намерение OP - проверить идеальную переадресацию. Вместо этого я бы предложил template <typename S, typename T> static bool TEST_EQ(S&& a, T&& b). - person ; 17.04.2018
comment
Другой способ - отключить вывод для второго параметра (см. здесь) для основной идеи) - person M.M; 17.04.2018

Итак, просто узнайте, что я не могу передать два разных типа значения одним аргументом шаблона. Итак, эта компиляция, возможно, добавление static_assert для проверки типов A и B было бы хорошим решением.

template<typename A, typename B>
static bool TEST_EQ(A&& a, B&& b) 
{
    return (forward<A>(a) == forward<B>(b));      
}
person Bryan Fok    schedule 17.04.2018