【问题标题】:Why is const sometimes part of the function signature? [duplicate]为什么 const 有时是函数签名的一部分? [复制]
【发布时间】:2016-07-06 05:43:20
【问题描述】:

为什么 const 应用于结构指针而不是结构时会创建不同的签名?

例如

typedef struct test_s {
  int foo;
} test;

void foo(test *ptr){
   return;
}

// This is ok
void foo(const test *ptr){
   return;
}

void foo(test t){
   return;
}

//This is an error
void foo(const test t){
   return;
}

(在 gcc 版本 4.9.2 上测试)

更具体地说,为什么当与指针的对不是错误时,底部的错误是错误的。引用的重复问题 (Functions with const arguments and Overloading) 似乎也认为带有指针的情况应该是重复的。

【问题讨论】:

  • 根据函数可以接受的参数来考虑。最后 2 个可以采用完全相同的参数,最后一个只是任意决定使其内部副本保持不变(实现细节)。第一个不能使用指向常量的指针,所以从外面看,它们确实是不同的函数。

标签: c++


【解决方案1】:
void foo(const test t){
   return;
}

是一个错误,因为它与:

void foo(test t){
   return;
}

这使它成为前一个函数的副本。


当函数的参数是test* 时,您可以取消引用指针并对其进行修改。修改将在调用函数中可见。

void foo(test *ptr){
   ptr->foo = 10;    // The state of the object in the calling function
                     // is changed.
   return;
}

当函数的参数是const test*时,你可以取消引用指针来访问它,但不能修改它。

void foo(const test *ptr){
   std::cout << ptr->foo << std::endl;  // OK
   ptr->foo = 10;                       // Not OK
   return;
}

出于同样的原因,您可以重载:

void foo(test& t);
void foo(const test& t);

当你试图超载时

void foo(test t);
void foo(const test t);

当你调用它时,两者都是同样好的候选人。编译器无法消除两者之间的歧义。另外,看看one of the answers to the dupe。它引用了 C++ 标准的部分,该部分说明了为什么最后两个是等价的。

【讨论】:

  • 这就是问题所在:为什么这是重复的,而带有指针的示例不是重复的?
  • @chacham15 编译器可以轻松区分指向非常量的指针和指向常数的指针。或者你认为const test*const 指针?
  • @LogicStuff 问题是为什么它可以区分const test*test * 而不能区分const testtest
  • @chacham15,查看更新后的答案。
猜你喜欢
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多