gpt4 book ai didi

c++ - 什么时候实例化 constexpr 函数模板?

转载 作者:可可西里 更新时间:2023-11-01 15:22:45 25 4
gpt4 key购买 nike

我正在研究一个使函数式头函数成为 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 不会。我在my proposal中描述如何使用 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?
}

如果 foo 不是 constexpr,GCC 和 clang 都会编译代码,如果是,则都拒绝它。

最佳答案

示例 #1 有效 CWG issue 1581 .目前还没有完全指定正确的行为应该是什么。方向好像是constexpr实例化应该是急切的,但这需要在将来的某个时候澄清。

示例 #2 很简单:调用 int Foo<int>::f() const是病式的。当你的 foo 发生这种情况对象是 const但不是当它不是const .类模板的成员函数仅在使用时实例化,如果你的 Foo<int>对象是非 const ,我们从不实例化 const成员函数,所以代码是合式的。 constexpr在这里不相关。

关于c++ - 什么时候实例化 constexpr 函数模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39917612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com