Несоответствие между определением конструктора и объявлением

Попробуйте с этим:

$('#show').on('show.bs.modal', function (event) {
    $(this).find('.modal-title').load($(event.relatedTarget).attr('data-mytitle'));
});
5
задан MikeT 1 April 2009 в 15:50
поделиться

4 ответа

В случаях как это спецификатору константы позволяют быть опущенным от объявления, потому что это ничего не изменяет для вызывающей стороны.

Это имеет значение только для контекста деталей реализации. Так вот почему это находится на определении, но не объявлении.

Пример:

//Both f and g have the same signature
void f(int x);
void g(const int x);

void f(const int x)//this is allowed
{
}

void g(const int x)
{
}

Любой звонящий f не будет заботиться, что Вы собираетесь рассматривать его как константу, потому что это - Ваша собственная копия переменной.

С интервалом * константа x, это - то же, это - Ваша копия указателя. Можно ли указать на что-то еще, не имеет значения для вызывающей стороны.

Если Вы опустили первую константу, хотя в интервале константы * константа, то это будет иметь значение, потому что для вызывающей стороны имеет значение при изменении данных, они указывают.

Ссылка: Стандарт C++, 8.3.5 параграфа 3:

"Любой спецификатор условной цены, изменяющий тип параметра, удален... Такие спецификаторы условной цены влияют только на определение параметра с телом функции; они не влияют на функциональный тип"

7
ответ дан 18 December 2019 в 10:49
поделиться

Этот пример покрыт явно в разделе разрешения перегрузки, 13.1/3b4:

Объявления параметра, которые отличаются только по присутствию или отсутствию константы и/или энергозависимый, эквивалентны. Таким образом, константа и энергозависимые спецификаторы типа для каждого типа параметра проигнорированы при определении, какая функция объявляется, определяется или вызывается.

[Пример:

typedef const int cInt;
int f (int);
int f (const int); // redeclaration of f(int)
int f (int) { ... } // definition of f(int)
int f (cInt) { ... } // error: redefinition of f(int)

— пример конца]

Так, это определенно в порядке.

5
ответ дан 18 December 2019 в 10:49
поделиться

Думайте о нем как о том же различии между

//testClass.hpp
class testClass {
  public:
     testClass(const int x);
};

//testClass.cpp
testClass::testClass(int x) {}

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

void f(int x) { }
void f(const int x) { } // Can't compile both of these.

int main()
{
   f(7); // Which gets called?
}

Из стандарта:

Объявления параметра, которые отличаются только по присутствию или отсутствию константы и/или энергозависимый, эквивалентны. Таким образом, константа и энергозависимые спецификаторы типа для каждого типа параметра проигнорированы при определении, какая функция объявляется, определяется или вызывается. [Пример:

typedef const int cInt;
int f (int);
int f (const int); // redeclaration of f(int)
int f (int) { ... } // definition of f(int)
int f (cInt) { ... } // error: redefinition of f(int)

— пример конца] Только константа и энергозависимые спецификаторы типа на наиболее удаленном уровне спецификации типа параметра проигнорирован этим способом; константа и энергозависимые спецификаторы типа, проложенные под землей в спецификации типа параметра, являются значительными и могут использоваться для различения объявлений 112 перегруженной функции), В частности, для любого типа T, “указатель на T”, “указатель на константу T”, и “указатель на энергозависимый T” считают отличными типами параметра, как “ссылка на T”, “ссылка на константу T”, и “ссылка на энергозависимый T”.

4
ответ дан 18 December 2019 в 10:49
поделиться

const int * const x не то же как const int * x потому что u уже сделал константу?

0
ответ дан 18 December 2019 в 10:49
поделиться
Другие вопросы по тегам:

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