gpt4 book ai didi

c++ - 为什么MSVC14允许声明指向动态未初始化const对象的指针?

转载 作者:行者123 更新时间:2023-12-01 05:48:38 25 4
gpt4 key购买 nike

在“C++ Primer 5th Edition”中,第12章“动态内存和智能指针”说:

Like any other const, a dynamically allocated const object must be initialized. A const dynamic object of a class type that defines a default constructor (§ 7.1.4, p. 263) may be initialized implicitly. Objects of other types must be explicitly initialized. Because the allocated object is const, the pointer returned by new is a pointer to const (§ 2.4.2, p. 62).



因此,将这样的语句视为错误:
const int* pi = new const int;
  • 如果我在GCC上运行此语句,它将无法编译,但是为什么要在MSVC14上编译呢?
  • 在我看来,它是一个愚蠢的错误,该指针是const的指针,这意味着以后无法分配它,也可以访问UB。
  • 最佳答案

    这不是MSVC中的“错误”,因为这不是编译器的工作,而是运行时。

    const int ci; // error ci is a constant object in Stack-memory so it must be initialized at compile-time.


    const int* cpi; // ok. just a pointer to const. The compiler doesn't know whether you'll assign an initialized const object or not.

    int choice = 0;
    std::cin >> choice;
    if(choice == arbitraryValue)
    cpi = new const int; // or cpi = new cont int(anotherArbitraryValue );
  • 如您所见,这是允许的,因为在编译时,编译器不知道如何在运行时创建和初始化对象。
  • 您似乎在问:
    int a[]{1, 2, 3, 4};
    int index;
    cin >> index; // e.g: user enters 10
    cout << a[i];

  • 为什么编译器允许使用超出范围的索引?同样,因为编译器不知道该运行时值;它仅检查索引类型是否为可用于访问数组索引的关联类型。

    关于c++ - 为什么MSVC14允许声明指向动态未初始化const对象的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58549357/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com