Varování o nepoužitém objektu v C++ i přesto, že v kódu je

Od Petr Zemek, 2016-09-17

Nedávno jsem narazil na zajímavou situaci, kdy mi překladač u C++ kódu hlásil varování, že vytvořený objekt není nikde použitý, ale přitom se na něm hned na dalším řádku volala metoda. Pojďme se společně podívat na onen kód a na to, zda měl překladač pravdu.

Kód a varování

Měl jsem takovýto kód:

MyClass& x = other.getObject();
x.doSomething();

Když jsem jej přeložil přes MSVC 2015, tak mi překladač hlásil následující varování:

warning C4189: 'x': local variable is initialized but not referenced

Cože? Vždyť na tom objektu hned na dalším řádku volám metodu!

I přes moje počáteční zmatení se však ukázalo, že měl překladač pravdu. Zkuste se nad tím na chvíli zamyslet, zda dokážete přijít s řešením. Preprocessor (makra apod.) v tom roli nehraje.

Řešení

C++ umožňuje volat statickou metodu třídy i přes instanci této třídy [C++14 9.4/2]. Tedy pokud MyClass vypadá takto

class MyClass {
public:
    // ...
    static void doSomething();
};

tak když potom napíšete

x.doSomething();

tak je to to stejné, jako byste napsali

MyClass::doSomething();

Čili kód výše vlastně dělá toto:

MyClass& x = other.getObject();
MyClass::doSomething();

Z takto upravené varianty je již jasně vidět, že měl překladač pravdu.

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.

Filtrované HTML (využíváno)

  • Povolené HTML značky: <a href hreflang> <em> <strong> <cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <table>
  • Zvýraznění syntaxe kódu lze povolit přes následující značky: <code>, <blockcode>, <bash>, <c>, <cpp>, <haskell>, <html>, <java>, <javascript>, <latex>, <perl>, <php>, <python>, <ruby>, <rust>, <sql>, <text>, <vim>, <xml>, <yaml>.
  • Řádky a odstavce se zalomí automaticky.
  • Webové a e-mailové adresy jsou automaticky převedeny na odkazy.
CAPTCHA
4 + 0 =
Vyřešte tento jednoduchý matematický příklad a vložte výsledek. Např. pro 1+3 vložte 4.
Nějak se mi tady rozmohl spam, takže poprosím o ověření.