Давайте посмотрим на этот шаблон кода, который я вижу часто:
struct Foo
{
template <typename T>
T* as1() { /* ... */ }
template <typename T>
T* as2(T*) { /* ... */ }
};
Первый метод должен использоваться следующим образом:
SomeComplexTypeAndNotAuto * a = foo.as1<SomeComplexTypeAndNotAuto>();
В то время как последний удобнее использовать поскольку вам не нужно повторять сложный тип:
SomeComplexTypeAndNotAuto * a = foo.as2(a);
Однако большинство компиляторов отклоняет второй случай с предупреждением Wuninitialized:
warning: variable 'a' is uninitialized when used within its own initialization [-Wuninitialized]
Совершенно очевидно, что переменная не является используется при инициализации, только его тип. Есть ли способ избежать этого предупреждения, не имея дело с адской прагмой для компилятора?
Редактировать:
Это не ясно из моего первоначального поста, но когда я писал SomeComplexTypeNotAuto
, я имел в виду, что такой код вроде этого: auto a = foo.as2(a);
не может быть разрешен, так как у вас есть для предоставления одного типа, чтобы компилятор мог его выводить.
Мой вопрос касался c того факта, что метод as2()
является шаблоном, так как он должен быть виден во время специализации для типа T
. Таким образом, компилятор может видеть, что аргумент T*
даже не имеет имени, поэтому он не используется / не может использоваться внутри функции. Поэтому я не понимаю, почему он предупреждает о предупреждении «неиспользуемая переменная», поскольку ясно, что он не используется.