Как, если оператор оценивается в C ++?

При компиляции шаблоны должны быть созданы экземплярами , прежде чем их компилировать в объектный код. Это создание может быть достигнуто только в том случае, если известны аргументы шаблона. Теперь представьте сценарий, в котором функция шаблона объявлена ​​в a.h, определенная в a.cpp и используемая в b.cpp. Когда компилируется a.cpp, не обязательно известно, что для предстоящей компиляции b.cpp потребуется экземпляр шаблона, не говоря уже о том, какой конкретный экземпляр это будет.

Можно утверждать, что компиляторы можно сделать умнее, чтобы «смотреть вперед» для всех применений шаблона, но я уверен, что это было бы нелегко создавать рекурсивные или другие сложные сценарии. AFAIK, компиляторы этого не делают. Как заметил Антон, некоторые компиляторы поддерживают явные декларации экспорта экземпляров шаблонов, но не все компиляторы поддерживают его (пока?).

33
задан derrdji 25 September 2009 в 19:19
поделиться

7 ответов

Нет, if (c) совпадает с if (c! = 0) . И if (! C) совпадает с if (c == 0) .

57
ответ дан 27 November 2019 в 17:51
поделиться

Я выйду из стаи на этом ... " if (c) " ближе всего к " if ((( bool) c) == true) ". Для целочисленных типов это означает « if (c! = 0) ». Как отмечали другие, перегрузка оператора ! = может вызвать некоторую странность, но также может вызвать перегрузку « operator bool () », если я не ошибаюсь.

23
ответ дан 27 November 2019 в 17:51
поделиться

Если c - указатель или числовое значение,

if( c )

эквивалентно

if( c != 0 )

Если c - логическое значение (тип bool [только C ++]), (edit: или определяемый пользователем тип с перегрузкой оператора bool ())

if( c )

эквивалентен

if( c == true )

Если c не является ни указателем, ни числовым значением, ни логическим,

if( c )

не будет компилироваться.

6
ответ дан 27 November 2019 в 17:51
поделиться

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

#include <stdio.h>

class c_type
{
public:
    operator bool()
    {
        return true;
    }
};

int main()
{
    c_type c;
    if (c) printf("true");
    if (!c) printf ("false");
}
0
ответ дан 27 November 2019 в 17:51
поделиться

Это больше похоже на if (c! = 0)

Конечно, оператор ! = может быть перегружен, поэтому не совсем точно сказать, что эти точно равны.

3
ответ дан 27 November 2019 в 17:51
поделиться

Да, они будут такими же, если вы измените == 0 на ! = 0 .

-1
ответ дан 27 November 2019 в 17:51
поделиться

Если c является указателем, то тест

if ( c )

не совсем то же самое, что

if ( c != 0 )

Последний представляет собой прямую проверку c против указателя 0 (нулевой), тогда как первый фактически является инструкцией для проверки, указывает ли c на действительный объект. Однако обычно компиляторы создают один и тот же код.

-5
ответ дан 27 November 2019 в 17:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: