在模板定义中调用非静态constexpr成员函数
Calling non-static constexpr member function in template definition
#include <type_traits>
template<size_t S> struct A
{
constexpr size_t size() const noexcept { return S; } // Not static on purpose!
};
struct B : public A<123> {};
template <class T>
typename std::enable_if<std::is_base_of_v<A<T().size()>, T>, bool>::type // (*)
f(const T&, const T&) noexcept { return true; }
int main() {
B b1, b2;
f(b1, b2);
}
在(*(行的原始问题中,我错误地使用了T()::size()
,这显然是不正确的,因为size()
不是静态的。该代码适用于T().size()
和std::declval<T>().size()
。所以现在的问题是有什么区别,如果这些方法中有任何一种更正确或更好?
您没有指定要使用的编译器,但gcc的错误消息提供了一个很大的提示:
t.C:12:52: error: cannot call member function ‘constexpr size_t A<S>::size() const
[with long unsigned int S = 123; size_t = long unsigned int]’ without object
相应调整方法声明后:
static constexpr size_t size() noexcept { return S; }
gcc随后编译了显示的代码,没有出现任何问题。
如果您的意图是让size()
成为一个常规类方法,那么您需要在模板中使用std::declval
,而不是将其作为静态方法调用。
size
是一个非静态函数,需要调用一个对象。将其设为static
并移除const
。
相关文章:
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 类内部和外部静态 constexpr 元组之间的差异
- 静态 constexpr 类成员变量对多线程读取是否安全?
- Clang 8 带有静态 constexpr 和数组的链接器错误 - 错误是什么以及如何解决它?
- constexpr函数中的静态constexpr变量
- 类无法访问自己的私有静态 constexpr 方法 - Clang bug?
- C++访问静态 constexpr 数组
- 初始化模板化类中的静态 constexpr 成员
- 静态 constexpr 成员变量初始化
- 是否使用静态 constexpr 变量 odr?
- 静态 constexpr 全局变量
- 使用静态 constexpr 成员的未解析外部符号
- 在模板定义中调用非静态constexpr成员函数
- 类本身内部的类对象的静态constexpr数组
- 为什么非成员静态 constexpr 变量不是隐式内联的?
- 类中的静态 constexpr 初始化链
- 静态 constexpr 的编译器优化
- 无法声明静态 constexpr char []
- 为什么 clang 并不总是为相同的静态 constexpr 产生常量值
- emplace_back会导致静态 constexpr 成员上出现链接错误