微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c 11中首选的初始化方式

int i = 0; // (a) Old C style should I use it?
int i{0}; // (b) Brace direct init
int i{}; // (c) Same as (b)
int i = {0}; // (d) as (b)
int i = {}; // (e) as (c)
auto i = 0; // (f) auto = int in this case.
auto i = int{0}; // (g) auto = more specific.
auto i = int{}; // (h) same as above (g)

一个使用?
萨特说使用:

int i = 0;
auto i = 0;

为什么不:

int i = {0};
auto i = int{0};

在某些情况下我应该摆脱“=”:

int i{0};
auto i{0}; // i is not what some might expect in this case. So I would prefer using "=" everywhere possible like int i = {0}; ...

编辑:
这就是我的目标,在我看来它是最一致的:

rectangle       w   = { origin(),extents() }; 
complex<double> c   = { 2.71828,3.14159 }; 
mystruct        m   = { 1,2 }; 
int             a[] = { 1,2,3,4 };
vector<int>     v   = { 1,4 };
point           p   = {}; // Default initializes members
int             i   = {0}; // Checked assembly for this and it's binary the same as int i{0}; Could be written also as int i = {};
string          s   = {""}; // Same as string s = {}; (OR) string s;

真人生活的例子:

std::string       title              = { pt.get<std::string>("document.window.title") };
const std::string file               = { R"(CoreSettings.xml)" };
int_least64_t     currentTick        = { 0 }; // (OR) int_least64_t currentTick = {};
bool              isRunning          = { false }; // (OR) bool isRunning = {};
ApP*              app                = { nullptr }; // (OR) ApP* app = {};
Event             event              = {};
double            detectedFrameRate  = { 1000000000.0 / (swapIntervalDeltaCumulative / 20.0) };
double            precision          = { static_cast<double>(boost::chrono::high_resolution_clock::period::num)
                                           / boost::chrono::high_resolution_clock::period::den };
auto              timeSpan           = boost::chrono::duration_cast<boost::chrono::nanoseconds>(NowTime - startTime);

替代方案是:

std::string       title             { pt.get<std::string>("document.window.title") };
const std::string file              { R"(CoreSettings.xml)" };
int_least64_t     currentTick       { 0 }; // (OR) int_least64_t currentTick{};
bool              isRunning         { false }; // (OR) bool isRunning{};
ApP*              app               { nullptr }; // (OR) ApP* app{};
Event             event             {};
double            detectedFrameRate { 1000000000.0 / (swapIntervalDeltaCumulative / 20.0) };
double            precision         { static_cast<double>(boost::chrono::high_resolution_clock::period::num)
                                        / boost::chrono::high_resolution_clock::period::den };
auto              timeSpan          = boost::chrono::duration_cast<boost::chrono::nanoseconds>(NowTime - startTime);

如果不使用大括号那么它很丑陋或容易出错:

int_least64_t     currentTick        = 0; // C style - changed this from double to int recently and compiler did not complain so I had something like int_least64_t currentTick = 0.0; ugly!
bool              isRunning          = false; // C style
ApP*              app                = nullptr; // C mixed with C++11 style;
Event             event; // might not be initialized by all compilers
int               someInt            = func(); // func() returns double no error but narrowing.

解决方法

对于简单的东西,例如你的例子中的int,我同意
int i=0;

可能是最常被理解的(在程序员中),但使用大括号初始化有一些优点,对我而言,它更受欢迎.例如

int i = 3.99;    // i gets 3; no warning,no error
int i{3.99};     // i gets 3; warning: "narrowing conversion"

它有助于编写更多无错误代码,因此在我看来这是一种更好的方法.

将它与汽车混合更危险.我通常只使用auto来:

>范围for for循环中的临时变量(例如for(const auto& n:mycollection))>简化命名lambda的声明>当我明确地使用它们时(而不是range-for)用于迭代器实例>模板化代码,这样做可以避免创建冗长的typedef

原文地址:https://www.jb51.cc/c/111853.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐