【问题标题】:C++ static const integral variable usage via pointer/reference?通过指针/引用使用 C++ 静态常量整数变量?
【发布时间】: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-&gt;Len...它确实是一个常数,事实上如果lcn 为空,lcn-&gt;Len 仍然可以正常编译和运行。我本可以在那里写MyLongClassNameIdRatherNotHaveEverywhere::Len,这无疑使(至少对我而言)更明显的是这是一个常数。还有其他缺点吗?

【问题讨论】:

  • “事实上,如果 lcn 为空,它仍然可以正常编译和运行” 这并不合法。这样做是未定义的行为。
  • @jrok:不,不是。您没有访问对象,只是使用对象类型来访问类的静态成员。指针没有被取消引用,并且不涉及未定义的行为。
  • @jrok:在审查了标准中的措辞后,我认为您是对的。虽然成员不是对象的一部分,但标准要求表达式 is 求值,在这种情况下(我理解)意味着取消引用指针(即使从未访问过对象),即要么是未定义的行为,要么是足够接近不想这样做:)
  • @DavidRodríguez-dribeas 从我在 5.2.5 的 n3337 中读到的内容,表达式 E1-&gt;E2 被转换为 (*(E1)).E2 并且即使结果不是确定结果所必需的,两个子表达式也会被评估完整表达(参见同一页上的子文本 64)。当然这意味着nullptr 被取消引用?编辑:忍者:)
  • @mark 可能。它是那些在实践中可以发挥作用的 UB 之一。

标签: c++ static constants standards


【解决方案1】:

除了怪异之外,我还可以看到一个缺点,如果运算符 -> 被重载... 范围解析运算符 :: btw,不能重载。

【讨论】:

    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 2015-03-29
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多