Is it allowed to cast away const on a const-defined object as long as it is not actually modified?

前端 未结 2 962
借酒劲吻你
借酒劲吻你 2020-12-17 10:51

Is the following allowed:

const int const_array[] = { 42 };

int maybe_inc(bool write, int* array) {
  if (write) array[0]++;
  return array[0];
}

int main(         


        
相关标签:
2条回答
  • 2020-12-17 11:10

    If it compiles, then it is allowed. But it does not mean, it is legal.

    #include <iostream>
    
    int main(int argc, char *argv[]) 
    {
        const int arr[] = {1, 2, 3};
        int* parr = const_cast<int*>(arr);
        parr[0] = 0;
        for(auto& n : arr)
            std::cout << n << std::endl;
    }
    

    The above code compiles in Ubuntu 20.04 g++ compiler. It also runs without problem. But the above code actually is undefined behaviour.

    0 讨论(0)
  • 2020-12-17 11:31

    Yes. This is entirely legal. (It is dangerous, but it is legal.) If you (attempt to) modify a an object declared const, then the behaviour is undefined.

    From n4659 (which is the last draft of C++17), section 10.1.7.1 [dcl.type.cv] para 4:

    Except that any class member declared mutable (10.1.1) can be modified, any attempt to modify a const object during its lifetime (6.8) results in undefined behavior

    My emphasis. That is from C++17, but this has been true of all versions of C++.

    If you look at the section on const_cast there is a note that

    [ Note: Depending on the type of the object, a write operation through the pointer, lvalue or pointer to data member resulting from a const_cast that casts away a const-qualifier76 may produce undefined behavior (10.1.7.1). — end note ]

    Notes are not normative, but this strongly implies that obtaining a non-const reference or pointer to a const object is legal. It is the write that is not allowed.

    0 讨论(0)
提交回复
热议问题