> On Dec 8, 2015, at 10:46 AM, Ziller Eike <[email protected]> wrote:
> 
> 
>> On Dec 7, 2015, at 2:41 PM, Knoll Lars <[email protected]> wrote:
>> 
>> On 07/12/15 15:44, "Development on behalf of Marc Mutz" 
>> <[email protected] on behalf of [email protected]> wrote:
>> 
>> 
>> 
>>> On Monday 07 December 2015 13:48:58 Ziller Eike wrote:
>>>> I do not think that more usage of ‘auto’ will make any code (or
>>>> refactorings of it) ‘safer’. IMO this is only about convenience and
>>>> readability.
>>> 
>>> std::map<std::string, std::string> stdMap = ...;
>>> 
>>> for (const std::pair<std::string, std::string> &e : stdMap)
>>>    doSomething(e.first, e.second);
>>> 
>>> for (const auto &e : stdMap)
>>>    doSomething(e.first, e.second);
>>> 
>>> The second loop is at least two orders of magnitude faster (doSomething() 
>>> is 
>>> an out-of-line no-op).
>> 
>> I think the summary here is that auto gives you one guarantee: It won’t do 
>> an implicit conversion for the initial assignment.

So, directly after the above example in Item 5, Item 6 in Effective Modern C++ 
continues with the examples of how you can shoot yourself in the foot _because_ 
you used auto.

std::vector<bool> features(const MyType &w);
MyType w;
auto someFeatureActive = features(w)[5];
doSomething(someFeatureActive); // <---- undefined behavior because 
someFeatureActive is _not_ a bool

We have something similar in Qt:

    QString a = "ABC";
    QString b = "abc";
    auto result = a + b;
    a.replace("A", "C");
    qDebug() << result;

prints “CBCabc” instead of “ABCabc” when QT_USE_FAST_OPERATOR_PLUS is defined, 
because result is not a QString in that case.

So funny/unwanted behavior can occur both because one used the wrong explicit 
type, and because one used auto instead of an explicit type.

> Granted.
> I really wonder though, why it is possible to assign the wrong type to a 
> _reference_ here, even if it is const ?
> I cannot do that with e.g. a std::vector (std::vector<const std::string> v; 
> const std::vector<std::string> &v2 = v;), so is that some funny thing with 
> std::pair?
> The spirit of the “you can use auto when assigning iterator type” was to mean 
> “you can use auto when assigning long ugly template types” at least in case 
> of ‘known patterns' (of which we do not have too many in Qt API, therefore 
> iterator types). So I think this use of auto is covered by the “spirit” of 
> the rule.
> 
> Br, Eike

-- 
Eike Ziller, Senior Software Engineer - The Qt Company GmbH
 
The Qt Company GmbH, Rudower Chaussee 13, D-12489 Berlin
Geschäftsführer: Mika Pälsi, Juha Varelius, Tuula Haataja
Sitz der Gesellschaft: Berlin, Registergericht: Amtsgericht Charlottenburg, HRB 
144331 B

_______________________________________________
Development mailing list
[email protected]
http://lists.qt-project.org/mailman/listinfo/development

Reply via email to