2016-08-17 5 views
8

У меня этот случай:литье к тому же типу

using T = classA; //T could be classA and could be `classB` in other platforms. 
T a; 
auto x = static_cast<classB>(a); 

В случае, когда Т classA отливка является обязательным. В случае T classB литье является избыточным.

По стандарту, будет ли отбрасываться второе литье (не более исполняемый код), так как это необязательно?

+1

На основании [этого ответа] (http://stackoverflow.com/a/26858851/391161) неясно, что вы подразумеваете под 'drop'. – merlin2011

+0

Если вы упали, вы имеете в виду, что это не приводит к выполнению кода, кроме да. На основе ответа ** merlin **, связанного с. – StoryTeller

+0

Да, это именно то, что я имел в виду. Спасибо –

ответ

3

От C++ 11 стандарта на:

5.2.9 Статический литой

1 Результат выражения static_cast<T>(v) является результатом преобразования выражения v к типу T.

Когда тип v такой же, как T, преобразование просто когда T не является классом. Достойный компилятор не должен генерировать любой исполняемый код для таких использования static_cast.

+7

Я думаю, что это неправильно, 'static_cast' должен вызывать экземпляр-конструктор. [Пример] (https://godbolt.org/g/ni7n55). см. 5.2.9/4 (в C++ 14) –

+0

Тогда почему в @ M.M, например, вызывается конструктор копирования? – Pumkko

+0

Этот [один] (http://gcc.godbolt.org/#compilers :! ((компилятор: g6, options: '- std% 3Dc% 2B% 2B14', source: 'struct + S% 0A% 7B% 0A +++ S (S + Const +% 26) +% 7B +% 7D% 0A ++ S()% 7B% 7D% 0A% 7D% 3B% 0A% 0Aint + Main()% 0A% 7B% 0A ++ S + s% 3B% 0A ++ static_cast% 3CS% 3E (s)% 3B% 0A% 7D)), filterAsm: (colouriseAsm: т, commentOnly: т, директивы: т, метки: т) , версия: 3) – Pumkko