Я работаю над предложением сделать функциональные функции заголовка 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
и оба отвергают это, если это так.
Пример № 1 активен CWG выпуск 1581. В настоящее время не совсем определено, что такое правильное поведение должен быть. Направление, кажется, что constexpr
создание экземпляров должно быть стремительным, но это необходимо уточнить в какой-то момент в будущем.
Пример № 2 прост: вызов int Foo<int>::f() const
плохо сформирован. Это происходит, когда ваш foo
объект const
но не тогда, когдаconst
, Функции-члены шаблонов классов создаются только при использовании, и если Foo<int>
объект неconst
мы никогда не создаем const
функция-член, поэтому код правильно сформирован. constexpr
здесь не актуально
Других решений пока нет …