Why are #39;constexpr#39; parameters not allowed?(为什么不允许#39;stexpr#39;参数?)
本文介绍了为什么不允许';stexpr';参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
为了区分编译器已知值,从而能够在编译时检测错误,使用‘constexpr’参数会很有用。示例:
int do_something(constexpr int x)
{
static_assert(x > 0, "x must be > 0");
return x + 5;
}
int do_something(int x)
{
if(x > 0) { cout << "x must be > 0" << endl; exit(-1); }
return x + 5;
}
int var;
do_something(9); //instance 'do_something(constexpr int x)' and check arg validity at compile time
do_something(0); //produces compiler error
do_something(var); //instance 'do_something(int x)'
目前这是无效代码。有人能给我解释一下为什么这不能实施吗?
编辑:
使用模板时,用户必须始终将文字作为模板参数传递,而不是作为函数参数传递,这非常不舒服:
template<int x>
int do_something()
{
static_assert(x > 0, "x must be > 0");
return x + 5;
}
int do_something(int x)
{
if(x > 0) { cout << "x must be > 0" << endl; exit(-1); }
return x + 5;
}
int var;
do_something(9); //instance 'do_something(int x)' and doesn't check validity at compile time
do_something(0); //same as above, if check was performed - compiler error should occur
do_something<9>(); //instance template 'do_something<int>()'
do_something<0>(); //produces compiler error
do_something(var); //instance 'do_something(int x)'
推荐答案
如果我了解您尝试正确执行的操作,则您请求的功能已经可用。这不是最雅致的,但我认为这已经足够好了。
您希望在编译时和运行时使用相同的语法调用函数,如果可能,让它在编译时求值,否则它应该在运行时求值。无论何时调用函数,您都需要对该函数计算断言。我相信这会满足您的要求:
constexpr int do_something(int x)
{
if(x <= 0)
{
std::cout << "x must be > 0" << std::endl; exit(-1);
}
return x + 5;
}
constexpr int compiletime_good = do_something(5);
constexpr int compiletime_bad = do_something(0); // Fails at compile-time
int runtime_good = do_something(5);
int runtime_bad = do_something(0); // Fails at runtime
constexpr int val_good = 5;
constexpr int val_bad = 0;
do_something(val_good);
do_something(val_bad); // Fails at run-time
int valrun_good = 5;
int valrun_bad = 0;
do_something(valrun_good);
do_something(valrun_bad); // Fails at run-time
这里的诀窍是在编译时以不需要静电_ASSERT的方式失败,在运行时也会失败。
这篇关于为什么不允许';stexpr';参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:为什么不允许';stexpr';参数?


基础教程推荐
猜你喜欢
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++,'if' 表达式中的变量声明 2021-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01