我正在尝试使用自定义类的瞬间作为模板参数.
class X {
public:
X() {};
};
template <class Foo, Foo foo>
struct Bar {
};
const X x;
Bar<X, x> foo;
Run Code Online (Sandbox Code Playgroud)
编译器声明x不能出现在常量表达式中.为什么?在编译时构造该对象有一切.
我使用以下代码获得"预期的常量表达式"错误:
TBoard 定义为:
TBoard = class
field: array[1..5,1..5] of Integer;
function check(const x, y: Integer): Integer;
function addShip(x, y, size, dir: Integer): Integer;
function attack(const x, y: Integer): Integer;
end;
Run Code Online (Sandbox Code Playgroud)
我在标记的行上得到错误:
function TBoard.attack(const x, y: Integer): Integer;
begin
Result := Self.check(x, y);
case Result of
0:
Self.field[x, y] := 1;
Exit; // error: constant expression expected
else Exit;
end;
end;
Run Code Online (Sandbox Code Playgroud)
有人知道发生了什么吗?
提前致谢!
我有一些遗留代码,我正在用"更新"的编译器构建并运行一些对我来说没有意义的静态const double初始化错误.这就是我所拥有的:
//header.h
class myclass
{
private:
static const double foo = 3.1415;
static const double bar = 12345.0 * foo;
};
Run Code Online (Sandbox Code Playgroud)
用gcc版本4.3.3编译此代码时 - 我看到以下错误:
foo cannot appear in a constant-expression
Run Code Online (Sandbox Code Playgroud)
我已经将其解释为不是静态初始化顺序惨败,因为我相信内部数据类型具有良好定义的初始化顺序 - 尤其是当它们位于同一个类中时.作为测试,我已经尝试static_cast< double >过表达式,但是这会产生另一个错误,指出在const表达式中只允许使用整数类型转换.
我想将以下C++代码重写为Rust:
using storage = array<int, 3>;
const size_t storage_len = sizeof(storage) / sizeof(storage::value_type);
Run Code Online (Sandbox Code Playgroud)
如何在没有具体变量的情况下获得恒定长度值?
作为动机,尽管看起来似乎微不足道,但我想在不声明变量的情况下打印数组的元素数.我知道我可以使用常量值或声明一个虚拟变量,但我想知道Rust如何保存C++代码.
我承认没有具体变量尚不清楚.我想实现上述C++功能,但这种解释可能会产生误导.我很好奇是否有任何方法可以获得数组的元素类型.
我有Perl代码,它使用带有初始化块的常量,如下所示:
use constant C => map {
...;
} (0..255);
Run Code Online (Sandbox Code Playgroud)
当我尝试在该行上设置断点时...;,它不起作用,这意味着:我可以设置断点,但是调试器不会在此停下来。
我试过了:
perl -d program.pl)启动程序b 2)中设置断点R,然后运行(r)程序但是调试器仍然没有停止,就像我没有设置断点一样。
我的Perl不是最新的;它是5.18.2,以防万一。
我在 Visual Studio 中使用 C 编写了一个代码,供用户输入数组的大小。
该代码无法在 Visual Studio 中运行并给出错误。
但在像 replit 这样的网站上它是有效的。
我不明白如何才能使其在 Visual Studio 中工作。

#include <stdio.h>
#include <time.h>
#include <string.h>
#include <math.h>
int main()
{
int m;
do
{
printf("please enter array size--> ");
scanf_s("%d", &m);
} while (m <= 1);
int arry[m];
for (int i = 0 + 1; i < m + 1; i++)
{
printf("%d,", arry[i] = i);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) c compiler-errors visual-studio constant-expression variable-length-array
这是我之前的问题的后续问题:为什么成员函数返回非静态数据成员而不是核心常量表达式?
该问题中提到的示例的简化版本是:
struct S {
const bool x = true;
constexpr bool f() { return x; }
};
int main() {
S s{};
static_assert(s.f()); // error: 's' is not a constexpr;
}
Run Code Online (Sandbox Code Playgroud)
标准中适用的措辞是 N4861:[expr.const]/(5.1):
表达式
E是核心常量表达式E,除非 的计算遵循抽象机 ([intro.execution]) 的规则,将计算以下其中一项:
- (5.1) ([expr.prim.this]),但作为 的一部分进行求值的函数 ([dcl.constexpr])
this除外;constexprE
据我可以解析,表达式E是并且s.f()它的计算结果是返回一个非静态成员。但这属于“例外”部分:成员函数是 constexpr 函数,它作为. 如果我解析正确,我期望得到常量表达式并且断言成功。thiss.f()this->xs.S::f()s.f()s.f()
s但是,该项目符号并未指定必须是常量表达式的要求。我不明白为什么声明sasconstexpr会编译程序,即使没有在此项目符号中定义的s要求constexpr。
我只是在我的示例中应用了措辞(5.1),但我看不到 …
我正在阅读 CLHS 中 DEFVAR 的描述(http://clhs.lisp.se/Body/m_defpar.htm)。我正在尝试确定什么是符合以下行为的行为
(defvar x '(1 2 3))
(defvar y '(1 2 3))
(nreverse x)
Run Code Online (Sandbox Code Playgroud)
也可以反转 Y 吗?如果解释器或编译器将 X 和 Y 的值识别为相同并且只创建一个实例来引用它们,那么这就是预期的情况。我想知道 CLHS 是否允许这种常量折叠。
我读了 DEFVAR 的 CLHS,但无法弄清楚;我没有看到那里讨论了该主题。CLHS 中的其他地方是否已解决此问题?
如果允许合并相同的常量值,那么解释器和编译器是否允许不同?(即一个合并而另一个不合并。)
关注这个问题为什么gcc不允许将const int作为case表达式?,什么促销类型用于switch-case表达式比较基本相同?或者有没有办法在C中使用具有常量索引的常量数组作为开关案例标签?.
从第一个链接,我试图替换:
case FOO: // aka 'const int FOO = 10'
Run Code Online (Sandbox Code Playgroud)
用:
case ((int) "toto"[0]): // can't be anything *but* constant
Run Code Online (Sandbox Code Playgroud)
这使 :
https://ideone.com/n1bmIb - > https://ideone.com/4aOSXR =在C++中工作
https://ideone.com/n1bmIb - > https://ideone.com/RrnO2R = C失败
我不太明白,因为"TOTO"字符串不能是任何东西,但一个常数之一,它甚至不是一个变量,它位于编译器内存的空白.我甚至没有玩C语言的'const'模糊逻辑(它实际上代表"只读,不是常数,你期望什么?"),问题是"数组访问"或"指针引用" "进入一个不用C语言评估的常量表达式,但在C++中做得很好.
我希望使用这个"技巧"来使用HASH_MACRO(str)从密钥标识符生成唯一的case标签值,最终使编译器在发生冲突时引发错误,因为找到了类似的标签值.
好的,好的,我被告知这些限制是为了简化语言工具(preproc,编译器,链接器)而C不是没有LISP,但你可以拥有全功能的LISP解释器/编译器,其大小只相当于C等价物的一小部分,所以这不是借口.
问题是:C11是否有"扩展",只允许这个"toto"东西在GCC,CLANG和...... MSVC中工作?我不想去C++路径(typedef的前向声明不再起作用)和嵌入式东西(因此编译时哈希计算用于时空失真).
是否有一种中间的"C +"语言更加"宽容"和"理解"嵌入更好一点,比如 - 赞美领主 - "作为位域成员的枚举",以及我们不能拥有的其他很好的东西(由于以外的原因)现实标准像沙漠太阳下的蜗牛一样演变?
#provemewrong,#changemymind,#norustplease