【问题标题】:Why is a type qualifier on a return type meaningless?为什么返回类型上的类型限定符没有意义?
【发布时间】:2009-10-22 13:27:34
【问题描述】:

假设我有这个例子:

char const * const
foo( ){
   /* which is initialized to const char * const */
   return str;
}

避免编译器警告“返回类型的类型限定符没有意义”的正确方法是什么?

【问题讨论】:

  • 是我自己还是这个问题不清楚?
  • @Jean-Lou:我同意问题的主体本身有些模糊,但问题的标题准确地传达了它的含义。

标签: c++ c


【解决方案1】:

你写它的方式是说“返回的指针值是 const”。但是非类类型的右值是不可修改的(从 C 继承),因此标准说非类类型的右值永远不是 const 限定的(即使你指定了最右边的 const 也被忽略了),因为 const 有点多余.一个人不写 - 例子:

  int f();
  int main() { f() = 0; } // error anyway!

  // const redundant. returned expression still has type "int", even though the 
  // function-type of g remains "int const()" (potential confusion!)
  int const g(); 

请注意,对于“g”类型,const 很重要,但对于从int const 类型生成的右值表达式,const 被忽略。所以下面是一个错误:

  int const f();
  int f() { } // different return type but same parameters

除了获取“g”本身的类型(例如,将&f 传递给模板并推断其类型)之外,我没有办法观察到“const”。最后注意“char const”和“const char”表示相同的类型。我建议您解决一个概念并在整个代码中使用它。

【讨论】:

  • 我建议始终使用尾随“const”(char const * const),因为这是您始终使用“const”的唯一方法。但是,我在这方面的人数远远超过...
  • @DevSolar:大多数大师(例如 Sutter)似乎都同意你的观点,并将限定符放在类型之后(类 const&,类 volatile)。
  • @DevSolar,只是为了澄清一下:他们不同意你关于最后一个尾随 const 的观点。他们可能同意出现在类型名称之后的第一个 const。
  • @Dev,我的意思是他们不同意int const f() 是好的。他们将省略最后一个尾随 const (请注意,这与 int f() const 不同 - 这是完全不同的事情)。 Matthieu(我也是)同意你的观点,在类型没问题之后const(比如int const a = 0;)。但并不是说它在函数返回类型中作为尾随 const 好(正如您的评论 可能 所表明的 - 所以我想澄清一下)。
  • 啊……现在我明白了。实际上,我并不是指函数返回类型的尾随 const,而只是始终使用 trailing const 其中 const 适合int const f() 不是)。
【解决方案2】:

在 C 中,因为函数返回值和限定值是没有意义的。
在 C++ 中可能会有所不同,请查看其他答案。

const int i = (const int)42; /* meaningless, the 42 is never gonna change */
int const foo(void); /* meaningless, the value returned from foo is never gonna change */

只有对象可以被有意义地限定。

const int *ip = (const int *)&errno; /* ok, `ip` points to an object qualified with `const` */
const char *foo(void); /* ok, `foo()` returns a pointer to a qualified object */

【讨论】:

  • 请注意,对于类类型,返回值的const 并非毫无意义,因为您可以在非常量右值上调用修改成员函数。 (前几天我们在这里用字符串处理了这个问题:(s1+s2).append(s3)。)像往常一样,litb 的回答详细而正确地解释了这一切。
  • 我的意思是我的回答只处理 C。更新以反映这一点。
  • 啊,他问了一个“C/C++”问题。 (奇怪的语言,那个。)对不起,我也没有看到这个。
【解决方案3】:

之前的答案都没有真正回答问题的“正确方法”部分。

我相信这个问题的答案是:

char const * foo( ){

这表示您正在返回一个常量字符的指针。

【讨论】:

  • 我理解这是一个指向字符的常量指针,而不是一个指向常量字符的指针
  • 不,实际上@user1076543 是对的,它是一个指向常量字符的指针,因为char const *const char * 是相同的。指向字符的常量指针是char * const
猜你喜欢
  • 1970-01-01
  • 2020-08-29
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 2013-04-12
  • 1970-01-01
  • 2013-02-18
相关资源
最近更新 更多