【发布时间】:2013-07-31 13:17:53
【问题描述】:
在声明和使用静态 const 积分时,我发现使用我正在使用的对象引用来访问变量是方便和自然的,而不是使用类名完全限定它。我想知道这是否有缺点?举个例子:
class MyLongClassNameIdRatherNotHaveEverywhere {
public:
static const int Len = 6;
//...
void otherInterestingThings();
void someWorkToDo();
};
int main() {
MyLongClassNameIdRatherNotHaveEverywhere *lcn = new MyLongClassNameIdRatherNotHaveEverywhere;
lcn->someWorkToDo();
cout << "the length is: " << lcn->Len << endl;
delete lcn;
return 0;
}
注意lcn->Len...它确实是一个常数,事实上如果lcn 为空,lcn->Len 仍然可以正常编译和运行。我本可以在那里写MyLongClassNameIdRatherNotHaveEverywhere::Len,这无疑使(至少对我而言)更明显的是这是一个常数。还有其他缺点吗?
【问题讨论】:
-
“事实上,如果 lcn 为空,它仍然可以正常编译和运行” 这并不合法。这样做是未定义的行为。
-
@jrok:不,不是。您没有访问对象,只是使用对象类型来访问类的静态成员。指针没有被取消引用,并且不涉及未定义的行为。
-
@jrok:在审查了标准中的措辞后,我认为您是对的。虽然成员不是对象的一部分,但标准要求表达式 is 求值,在这种情况下(我理解)意味着取消引用指针(即使从未访问过对象),即要么是未定义的行为,要么是足够接近不想这样做:)
-
@DavidRodríguez-dribeas 从我在 5.2.5 的 n3337 中读到的内容,表达式
E1->E2被转换为(*(E1)).E2并且即使结果不是确定结果所必需的,两个子表达式也会被评估完整表达(参见同一页上的子文本 64)。当然这意味着nullptr被取消引用?编辑:忍者:) -
@mark 可能。它是那些在实践中可以发挥作用的 UB 之一。
标签: c++ static constants standards