Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用auto声明空指针?_C++_C++11_Auto - Fatal编程技术网

C++ 如何使用auto声明空指针?

C++ 如何使用auto声明空指针?,c++,c++11,auto,C++,C++11,Auto,我们过去常常这样声明一个空指针,而不使用auto void* ptr = nullptr; 我们应该如何使用auto?我们应该用哪一个?或者也许还有其他更好的方法 auto ptr = (void*)nullptr; auto ptr = (void*)0; 这不是关于编码风格的问题。只是想知道如果我们需要使用auto,最好的方法应该是什么 auto ptr=static_cast(nullptr); 正如你可能知道的,C风格的类型转换并不太好,因为它们基本上可以转换任何东西,而静态类型转

我们过去常常这样声明一个空指针,而不使用
auto

void* ptr = nullptr;
我们应该如何使用
auto
?我们应该用哪一个?或者也许还有其他更好的方法

auto ptr = (void*)nullptr;
auto ptr = (void*)0;
这不是关于编码风格的问题。只是想知道如果我们需要使用
auto
,最好的方法应该是什么

auto ptr=static_cast(nullptr);

正如你可能知道的,C风格的类型转换并不太好,因为它们基本上可以转换任何东西,而静态类型转换既可以防止扔掉常量,也可以防止疯狂的东西被重新解释

如果您在声明过程中已经知道了类型,那么使用
auto
的理由很少。正如其他人提到的,原始样式应该是您想要的,这样可以保持代码简洁明了

void* ptr = nullptr;
如果出于某种原因,您打算使用
auto
,比如出于好奇或者出于无法控制的编码风格,或者您是
auto
的忠实粉丝,那么Nir的答案中提到的
static\u cast
将是比使用C风格转换更好的选择,后者可能会在运行时失败

auto ptr = static_cast<void*>(nullptr);
auto ptr=static_cast(nullptr);
参考


无铸件的替代品:

using void_ptr = void*;
auto ptr = void_ptr{};

auto ptr=std::add_pointer_t{};

原始版本有什么问题?@user1869785为什么。在这种情况下使用auto是过度的,也不清楚。只要坚持使用
void*
@user1869785-不要对编码风格过于武断。编写“几乎总是自动”代码比编写“总是自动”代码要好。尤其是当它使代码更清晰时。需要使用
auto
与某些编码风格保持一致,这只意味着你有一种需要放松的编码风格。无论如何,我对你的问题的回答是使用原版,其他两个选项都不好。等等,你的编码风格要求
auto
,但允许C型强制转换?!谢谢我想这正是我想要的,不必太过深入地讨论编码风格:)请不要这样做。如果您不知道类型,如果类型可能会更改,或者如果类型太长以至于变得凌乱,则应使用Auto。在这种情况下,您知道类型,类型不会改变,
void*
与指针类型一样短。@mascoj这不是讨论ops样式选择的论坛。不管怎样,我都没有强烈的感情。你可能不喜欢它,但它是C++社区中的一个合理的立场。我建议你们读一读Sutters关于几乎总是自动的文章,iirc他会在这里推荐自动(他会完全不同意你们的说法,我也是)。C风格的强制转换怎么可能“在运行时失败”?
using void_ptr = void*;
auto ptr = void_ptr{};
auto ptr = std::add_pointer_t<void>{};