Когда создаются шаблоны функций constexpr?

Я работаю над предложением сделать функциональные функции заголовка constexpr, (std::invoke, std::reference_wrapper, std::bind, std::mem_fn, std::not_fn)

Я узнал, что добавление constexpr может сломать существующий код, потому что constexpr функции с нетерпением создаются.

template<class T>
int f(T){
return T::not_existing_member;
}

template<class T>
constexpr int g(T){
return T::not_existing_member;
}

int main(){
decltype(f(0)) a; // Well-formed
decltype(g(0)) b; // Ill-formed if the function body is instantiated
}

GCC компилирует этот код, Clang — нет. Я описываю в мое предложение как вы можете справиться с энергичной реализацией с помощью перегрузок на примере std::bind,

Подскажите, где в стандарте это описано, когда компилятор должен и когда это разрешено создать экземпляр шаблона функции?

Точнее, я хочу знать, если в следующем примере стандартное поведение GCC и clang идентично или определяется реализацией:

template<class T>
struct Foo{
constexpr int f(){
return 0;
}

constexpr int f()const{
return T::not_existing_member;
}
};

int main(){
/* constexpr */ Foo<int> foo;
foo.f(); // Ill-formed with, Well-formed without constexpr by the standard?
}

И GCC, и Clang компилируют код, если foo не является constexpr и оба отвергают это, если это так.

11

Решение

Пример № 1 активен CWG выпуск 1581. В настоящее время не совсем определено, что такое правильное поведение должен быть. Направление, кажется, что constexpr создание экземпляров должно быть стремительным, но это необходимо уточнить в какой-то момент в будущем.

Пример № 2 прост: вызов int Foo<int>::f() const плохо сформирован. Это происходит, когда ваш foo объект const но не тогда, когдаconst, Функции-члены шаблонов классов создаются только при использовании, и если Foo<int> объект неconstмы никогда не создаем const функция-член, поэтому код правильно сформирован. constexpr здесь не актуально

6

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector