代码之家  ›  专栏  ›  技术社区  ›  Chubsdad

康斯特和乌布

  •  5
  • Chubsdad  · 技术社区  · 14 年前

    $5.2.11/7-“[注:取决于 通过指针、左值或指针 到数据成员 将一个 可以 生产 未定义的行为(7.1.5.1)。]"

    a) 首先,可以的用法。为什么是五月?标准中的其他地方对未定义的行为非常明确

    b) 为什么抛弃一个最初常量对象的常量不是直接的“未定义行为”。为什么要触发UB需要写操作?

    4 回复  |  直到 14 年前
        1
  •  4
  •   Charles Salvia    14 年前

    a) 首先,可以的用法。为什么 对于 未定义的行为

    可以

    C++标准使用“可能”或“可能”,如:

    1.3.12:未定义的行为 可以 当这个国际性的 行为的明确定义。

    强调我的。基本上,标准使用了“可能”一词 is allowed to ".

    原常量对象的常量 不是直接的“未定义” 行为。为什么写作是

    write触发UB,因为const对象可能存储在某些平台上的只读内存中。

        2
  •  4
  •   Kaz Dragon    14 年前

    我的理解是,只有当所讨论的对象基本上是const对象而不是const指针或对最初不是const的对象的引用时,才会是UB。

    基本上是const的数据可以被加载到内存的只读部分,而对它的写入是行不通的。但是,如果所讨论的对象基本上是可变的,那么它就可以正常工作。

    前任:

    const int  x = 4;
    const int *y = x;
    
    *const_cast<int*>(x) = 3; // UB - the pointed-to object may 
                              // be in read-only memory or whatever.
    
    int        a = 7;
    const int *b = a;
    
    *const_cast<int*>(b) = 6; // Not UB - the pointed-to object is 
                              // fundamentally mutable.
    

    对于下面的注释,因为代码在注释中看起来很糟糕:

    int i = 2;
    const int * cip; // pointer to const int
    cip = &i;        // OK: cv-qualified access path to unqualified
    ...
    int* ip;
    ip = const_cast <int *>( cip ); // cast needed to convert const int* to int*
    *ip = 4;                        // defined: *ip points to i, a non-const object
    

    所以这是特别允许的。

        3
  •  3
  •   Stack Overflow is garbage    14 年前

    对于你的第一个问题,如果 可以 产生未定义的行为,那么这并不能减少它的未定义性。

    对于第二部分,我认为这是因为互操作性的原因。例如,C在C99之前没有 const 关键字,因此如果要将const对象传递给C函数,则必须丢弃constness。因此,C++标准指定只要不执行写入,就可以允许这一点。如果C函数是只读的,则可以安全地丢弃constness。

    即使在C++中,不一致或不完全的正确性也是很常见的。因此,我们偶尔会遇到这样的情况:为了将const对象传递给一个不修改其参数但按非const接受其参数的函数,我们必须丢弃const。

        4
  •  1
  •   Didier Trosset    14 年前

    我相信那是因为 const