【发布时间】:2013-12-18 13:03:46
【问题描述】:
我注意到在函数声明中存在的值参数上可能有const 限定符,然后在定义中被省略。这不会改变函数的签名。它实际上编译得很好。
我还注意到常规类和模板类之间的行为不同。在 GCC 和 Clang 中的处理方式也有所不同。
考虑以下代码:
template <typename T> struct A {
void f(const int);
};
template <typename T> void A<T>::f(int x) {
x = 0;
}
struct B {
void f(const int);
};
void B::f(int x) {
x = 0;
}
void f() {
A<float> a;
a.f(0);
B b;
b.f(0);
}
当我使用 GCC 编译时,我没有收到任何错误。使用 Clang 我得到:
test.cpp:10:7: error: read-only variable is not assignable
x = 0;
~ ^
test.cpp:26:7: note: in instantiation of member function 'A<float>::f' requested here
a.f(0);
^
GCC 在定义中优先使用限定符。 Clang 使用了声明并且仅用于模板类A。
我的问题是:
- 这是由标准规定还是已定义此实现?
- 为什么常规类和模板类的行为不同?
- 为什么没有错误或至少警告
const限定符在声明和定义之间的使用不一致? - 在任何情况下这可能有用吗?
更新:
根据 cmets,这似乎是一个 Clang 错误。我开了一个new ticket。
更新:
错误已修复:
在 r203741 中修复
【问题讨论】:
-
我认为错误是一个错误。
-
顶级 const 限定符在语言级别被忽略。这意味着
void foo(const int);和void foo(int);被认为是完全相同的声明。我怀疑clang在这里出错了。你用的是哪个版本? -
@ShafikYaghmour 但在此示例中,模板参数与成员函数的参数无关。无论如何都是
const int(即int)。 -
@juanchopanza 我明白你在说什么
-
@juanchopanza 我没有删除我的答案,在模板案例中我找不到任何使这个不同的东西。