为什么编译器不选择`forward`的右值引用版本?

问题描述 投票:0回答:1

我写了std::forward的类似实现,希望找出在这种情况下编译器将选择哪个版本。问题是,似乎从来没有选择rvalue-reference版本。

#include <type_traits>
#include <iostream>
#include <string>
#include <utility>

using std::string;
using std::cout;
using std::endl;
using std::remove_reference;
using std::move;

namespace explicit_return {
template <typename type> type&& forward(typename remove_reference<type>::type&  value) { cout << "cp-"; return static_cast<type&&>(value); }
template <typename type> type&& forward(typename remove_reference<type>::type&& value) { cout << "mv-"; return static_cast<type&&>(value); }
}

void print(string const & value) { cout << "c:" << value << endl; }
void print(string &  value)      { cout << "l:" << value << endl; }
void print(string && value)      { cout << "r:" << value << endl; }

template <typename type> void explicit_print(type && value) {          print(explicit_return::forward<type>(value)); }
template <typename type> void indirect_print(type && value) { explicit_print(explicit_return::forward<type>(value)); }

int main()
{
    string a("perfect");
    indirect_print(a);
    indirect_print(move(a));
    indirect_print("forward");
}

让我们看输出

cp-cp-l:perfect
cp-cp-r:perfect
cp-cp-r:forward
c++ perfect-forwarding
1个回答
0
投票

关于第二个问题,我可能应该使用decltype(auto)

© www.soinside.com 2019 - 2024. All rights reserved.