只有引用时如何正确编写->运算符?

How to write -> operator correctly when you only have a reference?

本文关键字:gt 运算符 引用 何正确      更新时间:2023-10-16

这里有一个repro案例:

#include <iostream>
template< class MessageType >
class Augmented
{
public:
Augmented( const MessageType& message ) 
: m_message( message )
{}
const MessageType* operator->() const { return &m_message; }
private:
const MessageType& m_message;
};
template< class MessageType >
Augmented<MessageType> augmented( MessageType&& message )
{
return Augmented<MessageType>( std::forward<MessageType>(message) );
}
class Test
{
public:
void print() const {  std::cout << "Hello World" << std::endl; }
};

int main()
{
Test test;
auto augmented_test = augmented( test );
augmented_test->print();
return 0;
}

我正在使用VS2011(更新1)。当我尝试使用使用->运算符的代码时,我会得到以下错误:

错误C2528:'->':指向引用的指针是非法的

我理解这个错误,但我不知道如何在这种特定情况下避免它。我只需要一个指向由成员引用推断出的对象的指针。我尝试了几种不同的语法,但都导致了相同的错误。

知道如何正确编写这个运算符吗?


注意,要把重点放在这个问题上:我自愿使用引用,以避免在使用这个辅助代码的非常特定和孤立的上下文中出现永远不应该出现的副本;问题不在于课程的设计。


最后一次编辑:用完整的重新编写案例替换问题代码。DeadMG很准确,所以我接受他的回答。更准确地说:helper函数(augmented())将MessageType转发为Test&而不是Test,这是错误的。有几种方法可以解决这个问题,最简单的方法是使helper函数不转发类型,而只接受const MesssageType&

此代码对于任何特定的值类型都是合法的。但是,我怀疑您已经用引用实例化了它。这将导致const MessageType*扩展到const (T&)*,这是不合法的。您需要检查模板参数是否不是引用。