Consider the function:
template<typename T> void printme(T&& t) { for (auto i : t) std::cout << i; } or any other function that expects one parameter with a begin()/end() - enabled type.
Why is the following illegal?
printme({'a', 'b', 'c'});
When all these are legitimate:
printme(std::vector<char>({'a', 'b', 'c'})); printme(std::string("abc")); printme(std::array<char, 3> {'a', 'b', 'c'}); We can even write this:
const auto il = {'a', 'b', 'c'}; printme(il); or
printme<std::initializer_list<char>>({'a', 'b', 'c'});
Your first line printme({'a', 'b', 'c'}) is illegal because the template argument T could not be inferred. If you explicitly specify the template argument it will work, e.g. printme<vector<char>>({'a', 'b', 'c'}) or printme<initializer_list<char>>({'a', 'b', 'c'}).
The other ones you listed are legal because the argument has a well-defined type, so the template argument T can be deduced just fine.
Your snippet with auto also works because il is considered to be of type std::initializer_list<char>, and therefore the template argument to printme() can be deduced.
The only "funny" part here is that auto will pick the type std::initializer_list<char> but the template argument will not. This is because § 14.8.2.5/5 of the C++11 standard explicitly states that this is a non-deduced context for a template argument:
A function parameter for which the associated argument is an initializer list (8.5.4) but the parameter does not have std::initializer_list or reference to possibly cv-qualified std::initializer_list type. [Example:
template<class T> void g(T); g({1,2,3}); // error: no argument deduced for T— end example ]
However with auto, § 7.1.6.4/6 has explicit support for std::initializer_list<>
if the initializer is a braced-init-list (8.5.4), with
std::initializer_list<U>.
You can also overload the function to explicitly take an argument of type initializer_list.
template<typename T> void printme(std::initializer_list<T> t) { for (auto i : t) std::cout << i; }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With