我可以使用从左到右的样式和 `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
太过分了。
在尝试遵循 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
太过分了。