Rule A8-5-3 (required, implementation, automated)

A variable of type auto shall not be initialized using {} or ={} braced-initialization.

Rationale

If an initializer of a variable of type auto is enclosed in braces, then the result of type deduction may lead to developer confusion, as the variable initialized using {} or ={} will always be of std::initializer_list type. Note that some compilers, e.g. GCC or Clang, can implement this differently initializing a variable of type auto using {} will deduce an integer type, and initializing using ={} will deduce a std::initializer_list type. This is desirable type deduction which will be introduced into the C++ Language Standard with C++17.

Example

// $Id: A8-5-3.cpp 289436 2017-10-04 10:45:23Z michal.szczepankiewicz $
#include <cstdint>
#include <initializer_list>

void Fn() noexcept
{
    auto x1(10); // Compliant - the auto-declared variable is of type int, but
                 // not compliant with A8-5-2.
    auto x2{10}; // Non-compliant - according to C++14 standard the
                 // auto-declared variable is of type std::initializer_list.
                 // However, it can behave differently on different compilers.
    auto x3 = 10; // Compliant - the auto-declared variable is of type int, but
                  // non-compliant with A8-5-2.
    auto x4 = {10}; // Non-compliant - the auto-declared variable is of type
                    // std::initializer_list, non-compliant with A8-5-2.
    std::int8_t x5{10}; // Compliant
}

See also

Effective Modern C++ [13]: Item 2. Understand auto type deduction.

Effective Modern C++ [13]: Item 7. Distinguish between () and {} when creating objects.