5

我有以下 C++ 代码,其中声明中构造函数的参数与构造函数的定义具有不同的常量。

//testClass.hpp
class testClass {
  public:
     testClass(const int *x);
};

//testClass.cpp
testClass::testClass(const int * const x) {}

我能够使用 g++ 在没有警告的情况下编译它,这段代码应该编译还是至少给出一些警告?事实证明,64 位 solaris 上的内置 C++ 编译器给了我一个链接器错误,这就是我注意到存在问题的原因。

在这种情况下,匹配参数的规则是什么?这取决于编译器吗?

4

4 回答 4

7

在这种情况下,允许从声明中省略 const 说明符,因为它不会改变调用者的任何内容。

它仅与实现细节的上下文有关。所以这就是为什么它在定义上而不是在声明上。

例子:

//Both f and g have the same signature
void f(int x);
void g(const int x);

void f(const int x)//this is allowed
{
}

void g(const int x)
{
}

任何调用 f 的人都不会关心您是否会将其视为 const,因为它是您自己的变量副本。

与 int * const x 一样,它是你的指针的副本。你是否可以指向其他东西对调用者来说并不重要。

如果您在 const int * const 中省略了第一个 const,那么这会有所不同,因为如果您更改它指向的数据,这对调用者很重要。

参考:C++ 标准,8.3.5 第 3 段:

“任何修改参数类型的 cv 限定符都将被删除......这样的 cv 限定符仅影响带有函数体的参数定义;它们不影响函数类型”

于 2009-04-01T15:32:47.550 回答
5

将其视为相同的区别

//testClass.hpp
class testClass {
  public:
     testClass(const int x);
};

//testClass.cpp
testClass::testClass(int x) {}

这也可以编译。您不能基于按值传递参数的 const-ness 重载。想象一下这种情况:

void f(int x) { }
void f(const int x) { } // Can't compile both of these.

int main()
{
   f(7); // Which gets called?
}

从标准:

仅在存在或不存在 const 和/或 volatile 方面不同的参数声明是等效的。也就是说,在确定声明、定义或调用哪个函数时,将忽略每个参数类型的 const 和 volatile 类型说明符。[例子:

typedef const int cInt;
int f (int);
int f (const int); // redeclaration of f(int)
int f (int) { ... } // definition of f(int)
int f (cInt) { ... } // error: redefinition of f(int)

—end example] 只有参数类型说明最外层的 const 和 volatile 类型说明符以这种方式被忽略;隐藏在参数类型规范中的 const 和 volatile 类型说明符很重要,可用于区分重载函数声明。112) 特别是,对于任何类型 T,“指向 T”、“指向 const T 的指针”和“指针to volatile T”被认为是不同的参数类型,“reference to T”、“reference to const T”和“reference to volatile T”也是如此。</p>

于 2009-04-01T15:32:39.687 回答
5

此示例在重载解决部分 13.1/3b4 中明确介绍:

仅在存在或不存在 const 和/或 volatile 方面不同的参数声明是等效的。也就是说,在确定声明、定义或调用哪个函数时,将忽略每个参数类型的 const 和 volatile 类型说明符。

[例子:

typedef const int cInt;
int f (int);
int f (const int); // redeclaration of f(int)
int f (int) { ... } // definition of f(int)
int f (cInt) { ... } // error: redefinition of f(int)

——结束示例]

所以,肯定没问题。

于 2009-04-01T15:39:04.680 回答
0

const int * const x一样因为const int * x你已经做了const吗?

于 2009-04-01T15:33:15.177 回答