我可以使用从左到右的样式和 `auto` 来声明原始指针吗?

Can I use left-to-right style with `auto` for declaring a raw pointer?

在尝试遵循 the left-to-right declaration style 时,我遇到了使用 auto 声明默认初始化原始指针的情况,但没有成功:

auto* ptr = T*{};           // Error
auto* ptr = (T*){};         // Error
auto* ptr = nullptr_t<T>{}; // (I was desperate enough) - Error

正确的做法是什么?或者这根本不可能?

那么,为什么要将 *auto 一起使用?这应该可以正常工作:

auto ptr = (T*){};

首先,您 不必 对所有事情都使用 auto。这在很大程度上是一种判断调用,您应该将其视为工具箱中的另一个工具,当它使代码更易于阅读时应该使用它。

auto 的典型用途是当初始化表达式已经包含 return 类型 "obviously" 足够时:

auto it = v.begin();  // OK, some iterator, details unimportant
auto up = std::make_unique<T>(a, b, c);  // well-known maker function
auto * p = new T(a, b, c);  // must be a T *
auto * dp = dynamic_cast<Derived *>(bp);  // must be a Derived *
auto * p = const_cast<T *>(cp);  // must be a T *

以同样的方式你可以写:

auto * p = static_cast<T *>(nullptr);  // must be a T *

然而,与更直接的方法相比,这最终没有任何改进:

T * p = nullptr;

最后比较一下这两个:

auto * p = const_cast<T *>(cp);       // OK, p is a T *
const auto & cr = std::as_const(r);   // What is cr?

这证明了这里必须走的路线:第二行使用类型推导 maker 函数,所以我们所知道的是我们最终得到一个常量引用,但类型仍然隐藏。这是一个非常谨慎和谨慎的问题,这是适当的还是太模糊了。如果您的读者不执行非本地查找就无法理解代码,那可能 auto 太过分了。