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