Примером побочного эффекта создания экземпляра может быть внедрение друзей. Например:
Код: Выделить всё
// 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{}),"");
С другой стороны, при создании экземпляра 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