Effective Modern C++

【Effective Modern C++(2)】auto

2018-11-26  本文已影响36人  downdemo

05 使用auto替代显式类型声明

int x1; // 潜在的未初始化风险
auto x2; // 错误:必须初始化
auto x3 = 0; // OK
template<typename It>
void f(It b, It e)
{
    while (b != e)
    {
        typename std::iterator_traits<It>::value_type currValue = *b;
        ...
    }
}
template<typename It>
void f(It b, It e)
{
    while (b != e)
    {
        auto currValue = *b;
        …
    }
}
auto derefUPLess =
    [](const std::unique_ptr<A>& p1, const std::unique_ptr<A>& p2)
    { return *p1 < *p2; };
auto derefLess =
    [](const auto& p1, const auto& p2) { return *p1 < *p2; };
bool(const std::unique_ptr<Widget>&, const std::unique_ptr<Widget>&)
std::function<bool(const std::unique_ptr<Widget>&, const std::unique_ptr<Widget>&)> func;
std::function<bool(const std::unique_ptr<Widget>&, const std::unique_ptr<Widget>&)>
    derefUPLess =
        [](const std::unique_ptr<Widget>& p1, const std::unique_ptr<Widget>& p2)
        { return *p1 < *p2; };
std::vector<int> v;
…
unsigned sz = v.size();
std::unordered_map<std::string, int> m;
…
for (const std::pair<std::string, int>& p : m)
{
    …
}

06 auto推断出非预期类型时,使用explicitly typed initializer手法

std::vector<bool> features(const Widget& w);
Widget w;
bool highPriority = features(w)[5];
processWidget(w, highPriority);
auto highPriority = features(w)[5];
processWidget(w, highPriority); // 未定义行为
bool highPriority = features(w)[5];
processWidget(w, highPriority); // 未定义行为
Matrix sum = m1 + m2 + m3 + m4;
auto someVar = expression of "invisible" proxy class type;
auto highPriority = static_cast<bool>(features(w)[5]);
auto sum = static_cast<Matrix>(m1 + m2 + m3 + m4);
double calcEpsilon(); // 计算差值的函数
auto ep = static_cast<float>(calcEpsilon());
上一篇 下一篇

猜你喜欢

热点阅读