C++ 中是否存在不能用显式类型替换 auto 关键字的情况?

tra*_*veh 0 c++ variable-types c++20

我遇到了以下代码:

auto x = new int[10][10];
Run Code Online (Sandbox Code Playgroud)

它可以正确编译和运行,但我无法弄清楚与x赋值分开定义的类型是什么。

调试时显示的类型是int(*)[10]xint (*) x[10];或我尝试过的任何其他组合)是非法的。

那么是否存在auto无法用显式类型替换的情况......?(这是这样的情况吗?)

use*_*570 5

的类型xint (*)[10]. 有不同的方法可以解决这个问题。最简单的方法是尝试分配5x注意错误的内容:

error: invalid conversion from 'int' to 'int (*)[10]' [-fpermissive]
   13 |     x = 4;
      |         ^
      |         |
      |         int
Run Code Online (Sandbox Code Playgroud)

或者只是使用static_assert

static_assert(std::is_same<decltype(x), int(*)[10]>::value);
Run Code Online (Sandbox Code Playgroud)

这意味着如果您想显式创建x(不使用auto),那么您可以这样做:

int (*x)[10] = new int[10][10];
Run Code Online (Sandbox Code Playgroud)

C++ 中是否存在不能用显式类型替换 auto 关键字的情况?

现在回到标题,一个auto无法通过显式编写类型直接替换的示例是在处理无作用域的未命名枚举时,如下所示:演示

enum
{
    a,b,c
}obj;

int main()
{
//--vvvv----------->must use auto or decltype(obj)
    auto  obj2 = obj;
}
Run Code Online (Sandbox Code Playgroud)

同样,在处理未命名的类时。演示