Определяет ли стандарт, когда видны побочные эффекты создания экземпляра шаблона функции?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Определяет ли стандарт, когда видны побочные эффекты создания экземпляра шаблона функции?

Сообщение Anonymous »

Обратите внимание: я не спрашиваю: «Когда создаются экземпляры шаблонов функций?» Скорее, «Когда будут видны побочные эффекты этого создания экземпляра?»
Примером побочного эффекта создания экземпляра может быть внедрение друзей. Например:

Код: Выделить всё

// Same result on Clang, GCC, and MSVC.

template
struct FriendIndex {
friend constexpr bool Get(FriendIndex);
};

template
struct FriendInjector {
friend constexpr bool Get(FriendIndex) {
return true;
}
};

template 
auto InstantSideEffect() {
(void)FriendInjector{};
return 0;
}

template 
int DelayedSideEffect() {
(void)FriendInjector{};
return 0;
}

int dummy0 = InstantSideEffect();
// Will succeed.
static_assert(Get(FriendIndex{}),"");

int dummy1 = DelayedSideEffect();
// Will fail: Get(FriendIndex) is not a constant expression.
static_assert(Get(FriendIndex{}),"");
При создании экземпляра InstantSideEffect() дружественная функция constexpr Get(FriendIndex) определяется сразу после создания экземпляра и может использоваться в static_assert.
С другой стороны, при создании экземпляра DelayedSideEffect() определение Get(FriendIndex) не отображается сразу после создание экземпляра, и static_assert, использующий его, не сможет скомпилироваться.
Поскольку единственная разница между этими двумя функциями заключается в том, что InstantSideEffect() возвращает auto и DelayedSideEffect()< /code> возвращает int, я посмотрел стандарт, чтобы узнать, есть ли в нем какая-либо информация о том, как auto влияет на видимость этих побочных эффектов.
Черновик Стандарт C++14, говорится в 7.1.6.4 [dcl.spec.auto]/12:

Вывод типа возвращаемого значения для шаблона функции с заполнителем в объявленном типе возникает при создании экземпляра определения, даже если тело функции содержит оператор возврата с операндом, не зависящим от типа. [Примечание. Таким образом, любое использование специализации шаблона функции приведет к неявному созданию экземпляра. Любые ошибки, возникающие в результате этой реализации, не относятся к непосредственному контексту типа функции и могут привести к неправильному форматированию программы. — конечная сноска ]

Это звучит так, будто auto влияет на создание специализированных шаблонов функций, а auto возможно влияет на SFINAE . Однако я не вижу в стандарте ничего, указывающего, когда видны побочные эффекты.
Есть ли какая-то часть стандарта, которая касается того, когда видны побочные эффекты, такие как инъекция друзей? Или это просто совпадение, что три крупных компилятора делают дружественные инъекции мгновенно видимыми для шаблонов автоматических функций, и это может измениться в любой момент?

Подробнее здесь: https://stackoverflow.com/questions/788 ... ffects-are
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»