【发布时间】:2015-04-23 17:03:47
【问题描述】:
我有一些类和包装器。例如:
#include <iostream>
#include <string>
template<typename T>
class inner
{
public:
void f(T& v) { std::cout<<"lvalue: "<<v<<std::endl;}
void f(T&& v) { std::cout<<"rvalue: "<<v<<std::endl;}
};
template<typename T>
class wrapper
{
public:
template<typename _T>
void f(_T&& v) { i.f(std::forward<T>(v)); } //(1)
private:
inner<T> i;
};
int main()
{
wrapper<std::string> c;
//inner<std::string> c;
c.f("r");
std::string s = "l";
c.f(s);
}
c为inner的情况下输出正确:
rvalue: r
lvalue: l
但是当c 是wrapper 时输出不正确:
rvalue: r
rvalue: l
为什么左值变成右值?
如果wrapper 的f 在(1) 线上的定义有什么区别:
template<typename _T>
void f(_T v) { i.f(std::forward<T>(v)); } //without &&
【问题讨论】:
-
std::forward<_T>(v)。此外,您使用的是保留标识符。 -
@T.C.:答案不会进入 cmets
-
@T.C.我认为使用
_T和T只会导致类型不匹配时出现相同错误的不同位置。为什么它会导致将左值转换为右值?那么第二个问题和&&呢?删除它们不会影响任何事情。 -
_T是保留标识符。它的使用使您的整个程序格式错误。作为一个简单的规则,避免以_开头的标识符,并且在标识符中的任何地方都没有__,并且您将避免遇到(几乎所有?)标准保留的标识符。 (实际规则保留的标识符比这要少,但这是一个简单的足够规则)
标签: c++ class templates c++11 c++-standard-library