Constexpr类和模板函数匹配
constexpr class and template function match
我正在尝试constexpr来获得功能的感觉,我看到它可以使模板元编程更容易一点(如果我理解正确的话)。
我有这个虚拟的例子,其中一个类有一个const number字段,并且标记为constexpr的tor应该表现得像编译时常数。它确实这样做,但在模板函数匹配时却失败了:
#include <iostream>
class ConstNum
{
public:
constexpr ConstNum(int num) : _num(num)
{
}
constexpr int number() const
{
return _num;
}
private:
const int _num;
};
template<class T, size_t N>
constexpr int num_elements(const T (&arr) [N])
{
return N;
}
int main()
{
ConstNum c1(3);
char arr[c1.number()];
// fails to compile here with error message:
// No matching function for call to num_elements
//
std::cout << num_elements(arr) << std::endl;
return 0;
}
我在XCode上运行,错误信息给出了关于这个存在的详细信息语义问题:附加文本为:
- 候选模板被忽略:无法匹配'const T[N]'"char [c1.number ()
如果我将c1.number()替换为3,则编译良好。或者,如果我完全删除std::cout调用,这将编译得很好。
知道我在这里错过了什么吗?谢谢你
Sarang
即使函数标记为constexpr
, 也可能在运行时求值。如果你想在编译时求值,你应该在c1
对象中添加constexpr
说明符,否则它将在运行时被构造:
constexpr ConstNum c1(3);
输出:> ./main
3
提示:启用警告的Clang会为您的代码提供以下输出:
main.cpp:29:13: warning: variable length arrays are a C99 feature [-Wvla-extension]
char arr[c1.number()];
这意味着在编译时没有计算c1.number()
,正如您所期望的那样
相关文章:
- 条件constexpr函数
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- constexpr构造函数需要常量成员函数时出现问题
- constexpr 函数获取常量字符*
- 如何在 constexpr 函数中实现回退运行时
- 为什么我不能在 constexpr lambda 函数中使用 std::tuple
- 在非 constexpr 函数中作为左值传递的变量上使用 'constexpr' 函数
- 在 constexpr 构造函数 (c++17) 中赋值到 const char * 在使用 Android NDK 时
- NVCC 错误:string_view.h:constexpr 函数返回是非常量
- constexpr函数中的静态constexpr变量
- 在 constexpr funnction 中调用basic_string函数
- 为什么我的 constexpr 对象在我的函数中不是 constexpr?
- constexpr log10 整数函数
- C++:初始化 constexpr 构造函数中的成员数组
- 编译器生成的默认构造函数具有 constexpr 混淆行为
- 在 constexpr 构造函数中初始化数组是否合法?
- 在 constexpr 函数中断言
- MSVC 和函数参数的 constexpr?
- 具有位域的结构的 Constexpr 构造函数
- C++ 默认构造函数 constexpr 或正确未定义