参考构造函数

时间:2012-10-17 12:15:46

标签: c++ reference constructor

这是一个很快的问题。

我有一个功能:

template<class T> T& read(T& value)
{
    // Read an value of type T and assign it to variable "value"
    return value;
}

现在我可以使用以下函数:

char c;
read(c);

但我想将此功能用作:

char c = read(char());

这是可能的,还是我必须将其用作:

char c = read<char>();

? (我知道后者我必须稍微调整一下这个功能)

5 个答案:

答案 0 :(得分:1)

不,不是,因为临时(您的char())无法绑定到非const引用。由于您的要求,引用不能是const(“读取类型T的值并将其分配给变量”value“”)。

替代方案:

template<class T> T read()
{
    // Read an value of type T and assign it to variable "value"
    return T();
}

//...
c = read<char>();

答案 1 :(得分:1)

不,你不能,也可能不想。您不能将临时绑定到非const引用参数。无论如何,返回值和分配参数的用途是什么?这没有意义。

请使用:

template<class T> T read()
{
    // Read an value of type T and assign it to variable "value"
    return value;
}

编辑:从返回值中删除了&

答案 2 :(得分:0)

你给的第一个实际上没有意义。想一想,你传入一个匿名值,没有变量绑定到它。你怎么能分配呢?什么会改变?

由于char()是一个右值,你不能将它用作非const引用,只能用左值

在这种情况下,不需要一起引用。如果你想做你在问题中解释的内容,请尝试:

template<typename T>
T readT(){
  T v;
  read(v);
  return v;
}

现在我们可以输入:

char c = readT<char>();

你想做什么。

答案 3 :(得分:0)

在模板中,您说您希望编译器中有一个函数可以获得对T类型的可编辑引用,并返回对该类型的可编辑引用,因此您可以将其用作:{{1但是你不能将它用作char c; read( c );,因为read( char() )不可编辑(l值),因为你不能在等于运算符的左侧使用它:char()是无效的。如果您不想更改输入,可以使用以下内容:

char() = 3

然后你可以把它称为:

template< class T >
T read( const T& val ) {
    // do something with val and return a T
    return val;
}

如果你想要一个默认值,那么就像前面的例子一样简单:

read( char() );
read (char)1 );
char c = read( (char)2 );
read( c );

然后您就可以致电template< class T > T read( const T& val = T() ) { // do something with val and return a T return val; }

答案 4 :(得分:0)

好的,感谢您的评论,我注意到并非所有人都能理解我的问题。但有些人做了,在我们的帮助下,我现在有了这两个类功能:

template<class T> void read(T& value)
{
    event::deserialize(value, *this);
}

template<class T> T read()
{
    T temp;
    event::deserialize(temp, *this);
    return temp;
}

请注意,这些函数是名为Stream的类的成员。

感谢您的帮助!