【问题标题】:c++ - error :invalid initialization of reference of type 'const testGetter*&' from expression of type 'testGetter* const'c++ - 错误:从'testGetter * const'类型的表达式中对'const testGetter *&'类型的引用的初始化无效
【发布时间】:2012-10-31 11:47:03
【问题描述】:

我知道它已经出现了无数次,但这次是自动生成的代码:

class testGetter{
    testGetter * ptr; // wrote this
public:
// this is autogenerated by eclipse
    const testGetter*& getPtr() const {
        return ptr;
    }

    void setPtr(const testGetter*& ptr) {
        this->ptr = ptr;
    }
};

我在 Windows 7 mingw - g++ 版本 4.7.0

那么它是 Eclipse (juno) 模板中的一个错误吗?

编辑:编译器调用:

g++ -O0 -g3 -Wall -c -fmessage-length=0 -fpermissive -o Visitor.o "..\\Visitor.cpp"

EDIT 2013.06.12:我应该在收到反馈后添加I reported the thing

【问题讨论】:

  • 到底有什么问题?它使用什么数据来自动生成这样的代码?
  • 问题是 getter 的“const”放错了位置。在编写时,它返回对指向常量 testGetter 的指针的引用。它应该是testGetter * const & getPtr() - 对指向 testGetter 的常量指针的引用。
  • 我从不后悔将我的编码风格改为T const & 而不是const T &。这样,您可以从右到左读取类型(对 const T 的引用),并且您可以毫无问题地看到 T const *(指向 const T 的指针)、T * const(指向(可变)T 的 const 指针)之间的区别) 和 T const * const(指向 const T 的 const 指针)。
  • @Mr_and_Mrs_D:Eclipse 生成的代码不正确。我提供了一个答案,解释了为什么该语言不允许使用该代码。 C++ 是一种相当复杂的语言,我一般不会相信代码生成。它适用于简单的情况,但当事情变得复杂时,很难把它做好。使用代码生成加一点盐,理解它可以减轻打字的负担,但在某些情况下,您需要修复输出。还要考虑 getter 通常不是一个好主意,而指针则更少。考虑在语义上返回指针是否有意义。
  • @Mr_and_Mrs_D:还要注意问题不仅在于特定工具,还在于自动化过程。你班上的吸气剂应该做什么?指向对象的值是状态的一部分吗?在这种情况下,您需要返回一个 testGetter const * const &,但在某些情况下它不是 (std::shared_ptr),您想直接返回一个普通的 testGetter *。做出决定时要考虑程序的设计,Eclipse(或任何其他工具)不可能知道您的设计需要什么。

标签: c++ eclipse g++ mingw


【解决方案1】:
 const testGetter*&

这表示对指向 const testGetter 的非常量指针的引用。您不能从 testGetter* 转换为该类型,因为这会破坏以下示例中的 const 正确性:

const testGetter tmp;
testGetter t;
t.getPtr() = &tmp;     // !!!

如果允许转换,上面的代码将编译,并且在标有 !!! 的行之后存储在t(类型为testGetter*)中的指针将指向const testGetter,从而破坏了代码中的常量正确性。

您可能只想返回一个指针,而不是对指针的引用:

const testGetter* getPtr() const

或者添加一个额外的const 以保证常量正确性:

const testGetter *const& getPtr() const

在任何一种情况下,代码都会确保您不会将内部 testGetter* 设置为指向 const testGetter。

如果 getter 是由工具 (Eclipse) 自动生成的,则该工具存在错误或过于简单而无法生成正确的代码。您将需要手动创建 getter,或者修复生成器的输出。


旁注:如果可以选择 Eclipse CDT 或 g++,我敢打赌,这个 bug 经常出现在 eclipse 中。

【讨论】:

  • 谢谢!我最近使用 java 并且所有这些 * 闪烁很多 :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
相关资源
最近更新 更多