【问题标题】:C++ Pass by const reference syntaxC++ 通过 const 引用语法传递
【发布时间】:2023-03-03 17:14:01
【问题描述】:

我知道通过引用传递与通过指针传递的主题被大量讨论......我很确定在我读到这篇文章之前我理解了所有细微差别:

http://carlo17.home.xs4all.nl/cpp/const.qualifier.html

读取(以防链接失效)

The prototype for foobar can have any of the following footprints:
void foobar(TYPE);      // Pass by value
void foobar(TYPE&);     // Pass by reference
void foobar(TYPE const&);   // Pass by const reference

Note that I put the const to the right of TYPE because we don't know if TYPE (this is not a template parameter, but rather for instance a literal char*) is a pointer or not!

作者所说的“注意我把 const 放在 TYPE 的右边是什么意思,因为我们不知道 TYPE ... 是不是指针!”

我读到的关于这个主题的所有内容都一致地说:

void foodbar(TYPE const &)

也是等价的

void foobar(const TYPE &)

如果我对作者的理解正确,他/她的意思是:

const int *X vs int * const X where 指针,X 本身是 const 而 X 指向的是 const?

如果是这样,这是真的吗?

【问题讨论】:

  • 作者误解了语言(两者相同),老实说,我不知道他想说什么。还有一个理由是买一本书而不是尝试从一些在线文章中学习。
  • 购买一本书并不能保证您拥有优质资源,即使是热门书籍:seebs.net/c/c_tcn4e.html
  • 如果你错过了我写的内容,这里又是,“我读过的关于这个主题的所有内容都是一致的。”这包括几本书。特别是 Nicholas A. Solter、Scott J. Kleper 在第 332 页的“Professional C++”中写道:“请记住 const int &zRef 等同于 int const &zRef。” amazon.com/Professional-C-Programmer-Nicholas-Solter/dp/…

标签: c++ syntax reference


【解决方案1】:

如果 TYPE 是 #define 之类的 int*,则 const 的位置很重要。在这种情况下,您将获得const int*int* const,具体取决于const 的位置。

如果 TYPE 是 typedef 或模板参数,const 将影响整个类型。

在我看来,这更像是反对宏的另一个论据,而不是需要在声明中使用某种特定样式。

【讨论】:

  • +1,但我更喜欢在右侧使用 const... 以保持一致性。 (但我对宏的感觉比const的位置更强烈!)
  • @David:对宏有强烈的感觉是很常见的。我怀疑我和你一样。
【解决方案2】:

查看the C++ FAQ Lite(如文章所示),您从右到左阅读指针声明。因此,如果 TYPE 是指针,则 * 的位置确实会有所不同。点击链接查看全文。

【讨论】:

  • 仅当 TYPE 是扩展为指针类型的 时。如果它是 typedef 或模板参数,那么 const TYPE&TYPE const& 的含义相同,即使实际类型是指针类型。这就是使用 typedefs 的部分原因:)
  • 原始问题中的引用说:“考虑任意类型的类型。”作者显然不是指宏。
  • 因此,答案完全是错误的:typedef 的类型被视为一个单元,您最终不能在该类型声明的中间插入consts。 const TYPE&TYPE const& 的含义相同,即使 TYPE 可以“分解”以提供另一个位置供 const 关键字使用。
  • 我们用 Fred 代替 TYPE(以避免全大写类型的含义——这对我来说是 MACRO!)。所以,从常见问题中总结:Fred const* p 的意思是“p 指向一个常量 Fred”:Fred 对象不能通过 p 改变。 Fred* const p 的意思是“p 是一个指向 Fred 的 const 指针”:你不能改变指针 p,但是你可以通过 p 改变 Fred 对象。 Fred const* const p 的意思是“p 是一个指向常量 Fred 的常量指针”:不能改变指针 p 本身,也不能通过 p 改变 Fred 对象。所以对于指针类型,const 相对于类型的位置确实很重要。
  • 就“const 相对于指针类型的位置确实很重要”而言,使用Fred 来描述指针类型是无效的。如果Fred 是int* 的typedef,那么const Fred& 的含义与Fred const& 相同,即与int* const& 的含义相同。它表示const int*&,与int const*&相同。
【解决方案3】:
void foobar(TYPE const&);   // Pass by const reference

如果 TYPE 是一个指向 ABC 类型的指针,那么

void foobar(ABC* const&)

不同于

void foobar(const ABC* &)

我相信这就是作者的全部内容。

编辑

如果 typedef 是指针,这也适用

typedef SomeStruct* pSomeStruct;
void foobar(pSomeStruct* const &); // const reference to a pointer
                                   // to a pointer to SomeStruct
void foobar(const pSomeStruct* &); // reference to a pointer
                                   // to a const pointer to const SomeStruct

【讨论】:

  • 为了理解这一点,您必须更准确地理解“TYPE is 指针...”的含义。请参阅我对另一个答案的评论。
  • @Karl:我明白你关于 typedef 是一个单元的观点。但是,即使有指向类型定义类型的指针,我所说的也是有道理的。
猜你喜欢
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多