【问题标题】:Where, specifically, does the standard state that modifying a const object is undefined behaviour?具体来说,标准规定修改 const 对象是未定义的行为吗?
【发布时间】:2020-05-21 16:56:40
【问题描述】:

众所周知,以下示例表现出未定义的行为:

T const x = T();
T& r = any_suitable_conversion_to_Tref(x); // fine
r = T(); // UB

cppreference 已确认 const_cast

const_cast 可以形成指向实际引用 const 对象的非 const 类型的引用或指针,或实际引用 volatile 对象的非易失类型的引用或指针。通过非 const 访问路径修改 const 对象并通过非易失性左值引用易失性对象会导致未定义的行为。

但是,它没有说明例如c 风格的转换,它不引用标准(cppreference 通常从不引用)。

C++ 标准究竟在哪里禁止这样做?

【问题讨论】:

标签: c++ object language-lawyer constants


【解决方案1】:

[dcl.type.cv] 10.1.7 下的第 10 章“声明”中的 C++17 标准状态:

  1. 除了可以修改声明为 mutable (10.1.1) 的任何类成员外,任何在 const 对象的生命周期 (6.8) 期间修改其的尝试都会导致未定义的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2022-01-16
    相关资源
    最近更新 更多