LINUX.ORG.RU

default template argument

 ,


0

1
template <typename T> T myFunction()
{
   T result;

   ...
   <do stuff>;
   ...
   return result;
}

Для int'a выдаёт

warning: ‘result’ may be used uninitialized in this function

Как решить? Только специализация или можно как-то ещё?

★★★★★

Последнее исправление: UVV (всего исправлений: 1)

Ответ на: комментарий от UVV
~/dev> cat cc.cc 
int main()
{
    int i = int();
    return 0;
}
~/dev> clang++ cc.cc -o cc
~/dev> clang++ cc.cc -o cc -Wall
cc.cc:3:9: warning: unused variable 'i' [-Wunused-variable]
    int i = int();
        ^
1 warning generated.

Это тупо подстановка, как-то так.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)

T result;
return result;

в соглашениях о стиле бывает специально запрещают называть переменные ключевыми словами. Теперь я знаю из-за кого :)

Забавно. Спасибо, т.е. типа специально вызвать default ctor для встроенных типов?

это ж шаблон, ты туда в Т можешь не встроенный подложить - компиляторы щас умные, но не телепаты

slackwarrior ★★★★★
()

Смотри по алгоритму работы программы.
У тебя result это переменная не зависящая от входных данных, значит где-то не инициализированна.
Походу, у тебя даже в нешаблонной будет такое же предупреждение.
int myFunction()
{
int result;

...
<do stuff>;
...
return result;
}

Конечно при условии, что твой стаф аналогичен шаблонной.

xoomer
()
Ответ на: комментарий от slackwarrior

в соглашениях о стиле бывает специально запрещают называть переменные ключевыми словами. Теперь я знаю из-за кого :)

Ткни в ключевое слово

UVV ★★★★★
() автор топика
Ответ на: комментарий от yoghurt

мне «кажется» этот случай - повод вообще написать как-то по-другому, чтоб не вызывать дебатов с кем-нибудь потом :)

slackwarrior ★★★★★
()
Ответ на: комментарий от slackwarrior

Шаблон другой напиши. Из которого ясно будет, где у тебя встроенный тип, а где нет :)

Шта?

UVV ★★★★★
() автор топика

Для int'a выдаёт

потому что для совместимости с сишкой, дефолтные конструкторы для встроенных типов НЕ вызываются. Вызывай ручками, в C++ это можно.

emulek
()
Ответ на: комментарий от hateyoufeel

врядли он станет от этого умнее

anonymous
()
Ответ на: комментарий от emulek

Совместимость тут ни при чем. Инициализация переменных встроенных типов ничего не ломает с точки зрения совместимости.

anonymous
()
Ответ на: комментарий от UVV

Спасибо, т.е. типа специально вызвать default ctor для встроенных типов?

Да.

T result;

Это называется default-initialize:

8.5.11: If no initializer is specified for an object, the object is default-initialized; if no initialization is performed, an object with automatic or dynamic storage duration has indeterminate value. [Note: Objects with static or thread storage duration are zero-initialized, see 3.6.2. — end note]

8.5.6: To default-initialize an object of type T means:

  • if T is a (possibly cv-qualified) class type (Clause 9), the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);
  • if T is an array type, each element is default-initialized;
  • otherwise, no initialization is performed.
T result = T();

, а именно

T()

Это называется value-initialize:

8.5.10: An object whose initializer is an empty set of parentheses, i.e., (), shall be value-initialized.

8.5.7: To value-initialize an object of type T means:

  • if T is a (possibly cv-qualified) class type (Clause 9) with a user-provided constructor (12.1), then the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);
  • if T is a (possibly cv-qualified) non-union class type without a user-provided constructor, then the object is zero-initialized and, if T’s implicitly-declared default constructor is non-trivial, that constructor is called.
  • if T is an array type, then each element is value-initialized;
  • otherwise, the object is zero-initialized.

8.5.5: To zero-initialize an object or reference of type T means:

  • if T is a scalar type (3.9), the object is set to the value 0 (zero), taken as an integral constant expression, T;
  • if T is a (possibly cv-qualified) non-union class type, each non-static data member and each base-class subobject is zero-initialized and padding is initialized to zero bits;
  • if T is a (possibly cv-qualified) union type, the object’s first non-static named data member is zero-initialized and padding is initialized to zero bits;
  • if T is an array type, each element is zero-initialized;
  • if T is a reference type, no initialization is performed.
Pavval ★★★★★
()
Ответ на: комментарий от Pavval

все четко, по теме. впрочем, как всегда

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.