Есть "T var ();"всегда объявление функции в c ++? - PullRequest
3 голосов
/ 18 декабря 2010

Может ли это быть определением (определением) в определенных случаях?

Ответы [ 2 ]

3 голосов
/ 18 декабря 2010

Это всегда объявление функции в C ++ (и в C), за исключением случаев, когда оно появляется как объявление параметра, и в этом случае оно объявляет указатель функции.

Обратное не может быть указано, хотя:

Является ли "T var;" всегда объявление объекта в C ++?

Нет, это не так, потому что T может быть типом функции, и в этом случае var будет объявлено как функция, за исключением случаев, когда оно появляется как объявление параметра, как указано выше.

0 голосов
/ 18 декабря 2010

Является ли “T var();” всегда объявлением функции в c ++?

Зависит от контекста.

Контекст 1:

template<typename T> 
void func()
{
    T var(); // function declaration
}

Контекст 2:

template<typename T>
void func(T var() ) // equivalent to `template<typename T> void func (T()) { } `
{
}

В этом случае func возвращает void и принимает в качестве аргумента указатель на функцию, возвращающую T. Опускать var необязательно.


Как насчет T var(1) ;, это экземпляр или то же самое, что T var = T(1);

T var(1) - прямая инициализация , тогда как T var = T(1) - копирование инициализации . В обоих случаях объект var инициализируется в T (1).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...