2009-04-06 2 views
1

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

template<typename T> T Foo(T& target) 
{ 
    //Assign to 'target', but never read from it before that. 
    //Also, 'target' is going to be a POD-type. 

    target = T(); 

    return target; 
} 

int main() 
{ 
    float value = Foo(value); 
} 

Это чувствует себя небезопасно (т.е., убедившись, что target никогда не назначается до его использования), есть ли другие потенциально летальные проблемы с этим видом интерфейса?

+0

Я согласен, что он «чувствует» себя небезопасно, и я не могу найти ничего в стандарте, рассматривая это. Есть ли веская причина, почему так делается? Если нет, я обычно предлагаю вам изменить его, но вы сказали, что не можете, поэтому я подозреваю, что это всего лишь случай обучения жить с ним. :( –

ответ

1

Ну .. Если вы делаете код:

T value; 

то значение будет получить его конструктор называется на нем. Шаблон честно выглядит просто, как конструктор просто получает вызов дважды.

Кроме того, если Т просто старые данные, то нет летальной проблемы, которая может возникнуть ...

Что именно вас беспокоят происходит?

+0

Ну, когда введена область Foo, цель (ака, значение в основном) неправильно инициализирована, что может вызвать проблемы, если она случайно прочитана в Foo, прежде чем ей присвоено что-то значимое. – 2009-04-06 02:00:13

+0

Ооо. t знать, будет ли конструктор вызван по этой точке ... Для простых старых данных я бы не стал слишком беспокоиться, так как у вас будет зарезервированное пространство для стека. Самый худший случай, о котором я могу думать, - это то, что у вас будет бессмыслица. –

+0

То же самое касается: UB читать неинициализированный POD-тип? – 2009-04-06 02:04:22

Смежные вопросы