Кто-то мог объяснить различие между “ссылкой” и “указателем” в этом случае?

При использовании @Id аннотация с полями непосредственно поддерживаемых типов не является единственным способом определить идентификационные данные объекта (см. @IdClass приблизительно с @Id аннотации или @EmbeddedId с @Embedded), спецификация JPA требует первичного ключа для каждого объекта.

Тем не менее Вам не нужны объекты для использования JPA с представлениями базы данных. Как отображающийся на представление не отличается от отображения до таблицы с точки зрения SQL, Вы могли все еще использовать собственные запросы (createNativeQuery на EntityManager) для получения скалярных величин вместо этого.

6
задан Community 23 May 2017 в 10:27
поделиться

4 ответа

Из-за языковой разницы (сохраняются только объявления функций ниже, поскольку это только важно)

void execute( void (&func)() );

void g();
int main() {
  void (*fp)() = g;
  execute(fp); // doesn't work
  execute(&g); // doesn't work either
  execute(g); // works
}

Это не работает, потому что ему нужна функция, а не указатель на функцию. По той же причине, что ответ на массив отклоняет указатель, он также отклоняет указатель. Вы должны передать букву «g» напрямую.

Для шаблонов это тоже имеет значение

template<typename T>
void execute(T &t) { T u = t; u(); }

template<typename T>
void execute(T t) { T u = t; u(); }

Эти два очень сильно отличаются друг от друга. Если вы вызовете его с помощью execute (g); , как указано выше, то первый попытается объявить функцию и инициализировать ее с помощью t (ссылка на g ) . Сгенерированная функция будет выглядеть так

void execute(void(&t)()) { void u() = t; u(); }

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


Я не знаю, почему MSVC по-разному обрабатывает их при встраивании, но я также подозреваю, что это потому, что ссылки на функции появляются реже.

3
ответ дан 17 December 2019 в 00:11
поделиться

Я думаю, что это связано со стандартом C ++ 4.3:

l-значение типа функции T может быть преобразовано в r-значение типа «указатель на T.» Результатом будет указатель на функция.

3
ответ дан 17 December 2019 в 00:11
поделиться

Это не такая распространенная идиома, так что, возможно, команда VS не добавила правила для ее оптимизации.

3
ответ дан 17 December 2019 в 00:11
поделиться

Разница между ссылкой (&) и указателем (*) заключается в том, что ссылка предоставляет адрес переменной или ее местоположение, а указатель указывает на местоположение в памяти сохраненного адреса. в нем.

int *pointer;
int variable;

pointer = &variable; // assigning the address of variable to pointer 

variable = 53;  // value of variable

cout << *pointer; // This should output the value of the address where is pointing, in this
                  //  case 53, that is the value of variable to where is pointing.

Мы можем заключить, что (& переменная) имеет адрес этой ячейки памяти, а * anyname указывает на адрес, хранящийся в ее памяти ...

-2
ответ дан 17 December 2019 в 00:11
поделиться
Другие вопросы по тегам:

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