Answers for theory questions 2017-04-20 1. A using declaration is used to support ADL. If we have a qualified call here, we would force the compiler to look in std for all possible functions. The problem is that a user-defined type not in the std will of course not have it's begin function in that namespace. The question you might ask yourself now is why that declaration is needed at all, won't ADL take care of calling the correct function anyways? Well most of the time, yes, the problem is the c-style arrays. They are part of the language and not in the std but there is an overload of begin in the library. The using-declaration gives us access to that function. 2. template<> struct foo; 3. static_assert requires a compile-time expression as first argument. This will not compile since vector::size is runtime. 4. The problem is (of course) due to type conversions. An int can be implicitly converted to both double and short and both will give possible loss of precision. 5. length gives the number of arguments passed to the function. length(4,'a',"hello") => 3 length() => 0