- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我最近在使用 constexpr,但我才意识到我用错了。我很好奇我是否可以创建一个编译时变量(或变量对象)。
来自 cppreference.com 的 constexpr 定义告诉我们:
The constexpr specifier declares that it is possible to evaluate the value of the function or variable at compile time.
那么为什么下面的代码不正确?
#include <iostream>
int main()
{
constexpr int x = 30;
x += 10;
std::cout << x;
}
这个整数可以在编译时完美求值。我知道编译器可以在没有 constexpr 修饰符的情况下优化这样的变量,但是如果我想要一个编译时对象怎么办?
#include <iostream>
class ctFoo {
public:
ctFoo()
: value{ 0 }
{
}
int accumulate(int value_) {
return (value += value_), value;
}
int value;
};
int main()
{
ctFoo foo;
std::cout << foo.accumulate(100);
}
我有什么把握,这段代码将在编译时进行评估?我问这个,因为我目前正在写一些 Vector2 和 Vector3 数学,我想创建这样的实现,它将能够处理编译时和运行时计算。有可能吗?
谢谢。
正如 max66 指出的那样,constexpr 意味着 const,但我要问:为什么这样?现代编译器应该能够在编译时推断出它的值(value)。另外,我知道我可以简单地创建另一个 constexpr 常量(广告。最上面的代码示例),但我的问题涉及更复杂的代码。
最佳答案
So why is following code incorrect?
#include <iostream>
int main()
{
constexpr int x = 30;
x += 10;
std::cout << x;
}
constexpr
表示 const
。您需要将其限制在 constexpr
上下文中:
constexpr int foo() {
int x = 30;
x += 10;
return x;
}
But what if I want to have a compile-time object?
#include <iostream>
class ctFoo {
public:
ctFoo()
: value{ 0 }
{
}
int accumulate(int value_) {
return (value += value_), value;
}
int value;
};
给它 constexpr
支持:
constexpr ctFoo() : value{ 0 }
constexpr int accumulate(int value_) {
value += value_;
return value;
}
您现在拥有的保证是,如果您的 ctFoo
对象是一个常量表达式并且您在 constexpr
上下文中调用 accumulate
,例如 foo
函数示例,那么您可以在编译时使用结果。例如:
constexpr int foo() {
ctFoo f;
f.accumulate(10);
return f.value;
}
static_assert(foo() == 10);
或者:
constexpr void accumulate(ctFoo& f) {
f.accumulate(10);
}
constexpr int foo() {
ctFoo f;
accumulate(f);
return f.value;
}
static_assert(foo() == 10);
这里要记住的关键是运行时评估也是一个选项。如果我将某些 ctFoo
的 value
设置为运行时值(例如,用户输入),则 accumulate
调用不可能发生在编译时。但这没关系 - 相同的代码在两种情况下都有效。
关于C++ - 我可以创建编译时变量对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48130611/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to nest OR statements in JavaScript? 有没有办法做到这一点:
在 JavaScript 中有没有办法让一个变量总是等于一个变量?喜欢var1 = var2但是当var2更新,也是var1 . 例子 var var1 = document.getElementBy
我正在努力理解这代表什么 var1 = var2 == var3 我的猜测是这等同于: if (var2 == var3): var1 = var2 最佳答案 赋值 var1 = var2
这个问题已经有答案了: What does the PHP error message "Notice: Use of undefined constant" mean? (2 个回答) 已关闭 8
我在临时表中有几条记录,我想从每条记录中获取一个值并将其添加到一个变量中,例如 color | caption -------------------------------- re
如何将字符串转为变量(字符串变量--> $variable)? 或者用逗号分隔的变量列表然后转换为实际变量。 我有 2 个文件: 列名文件 行文件 我需要根据字符串匹配行文件中的整行,并根据列名文件命
我有一个我无法解决的基本 php 问题,我也想了解为什么! $upperValueCB = 10; $passNodeMatrixSource = 'CB'; $topValue= '$uppe
这可能吗? php $variable = $variable1 || $variable2? 如果 $variable1 为空则使用 $variable2 是否存在类似的东西? 最佳答案 PHP 5
在 Perl 5.20 中,for 循环似乎能够修改模块作用域的变量,但不能修改父作用域中的词法变量。 #!/usr/bin/env perl use strict; use warnings; ou
为什么这不起作用: var variable; variable = variable.concat(variable2); $('#lunk').append(variable) 我无法弄清楚这一点
根据我的理解,在32位机器上,指针的sizeof是32位(4字节),而在64位机器上,它是8字节。无论它们指向什么数据类型,它们都有固定的大小。我的计算机在 64 位上运行,但是当我打印包含 * 的大
例如: int a = 10; a += 1.5; 这运行得很完美,但是 a = a+1.5; 此作业表示类型不匹配:无法从 double 转换为 int。所以我的问题是:+= 运算符 和= 运算符
您好,我写了这个 MySQL 存储过程,但我一直收到这个语法错误 #1064 - You have an error in your SQL syntax; check the manual that
我试图在我的场景中显示特定的奖牌,这取决于你的高分是基于关卡的目标。 // Get Medal Colour if levelHighscore goalScore { sc
我必须维护相当古老的 Visual C++ 源代码的大型代码库。我发现代码如下: bIsOk = !!m_ptr->isOpen(some Parameters) bIsOk的数据类型是bool,is
我有一个从 MySQL 数据库中提取的动态产品列表。在 list 上有一个立即联系 按钮,我正在使用一个 jquery Modal 脚本,它会弹出一个表单。 我的问题是尝试将产品信息变量传递给该弹出窗
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
jQuery Core Style Guidelines建议两种不同的方法来检查变量是否已定义。 全局变量:typeof variable === "undefined" 局部变量:variable
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: “Variable” Variables in Javascript? 我想肯定有一种方法可以在 JavaScrip
在语句中使用多重赋值有什么优点或缺点吗?在简单的例子中 var1 = var2 = true; 赋值是从右到左的(我相信 C# 中的所有赋值都是如此,而且可能是 Java,尽管我没有检查后者)。但是,
我是一名优秀的程序员,十分优秀!