标签: constant-expression

自定义对象的常量表达式

我正在尝试使用自定义类的瞬间作为模板参数.

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不能出现在常量表达式中.为什么?在编译时构造该对象有一切.

c++ templates constant-expression

1
推荐指数
1
解决办法
198
查看次数

德尔福常量表达式预期

我使用以下代码获得"预期的常量表达式"错误:

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)

有人知道发生了什么吗?
提前致谢!

delphi constant-expression

1
推荐指数
1
解决办法
2747
查看次数

C++中的static const double初始化

我有一些遗留代码,我正在用"更新"的编译器构建并运行一些对我来说没有意义的静态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++ double initialization constant-expression

1
推荐指数
1
解决办法
506
查看次数

我可以只使用类型而不是具体变量来获取Rust数组的长度吗?

我想将以下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++功能,但这种解释可能会产生误导.我很好奇是否有任何方法可以获得数组的元素类型.

arrays constant-expression rust dependent-type

1
推荐指数
2
解决办法
592
查看次数

如何将工作断点设置为常量表达式?

我有Perl代码,它使用带有初始化块的常量,如下所示:

use constant C => map {
    ...;
} (0..255);
Run Code Online (Sandbox Code Playgroud)

当我尝试在该行上设置断点...;,它不起作用,这意味着:我可以设置断点,但是调试器不会在此停下来

我试过了:

  1. 使用调试器(perl -d program.pl)启动程序
  2. 在调试器(b 2)中设置断点
  3. 使用重新加载R,然后运行(r)程序

但是调试器仍然没有停止,就像我没有设置断点一样。

我的Perl不是最新的;它是5.18.2,以防万一。

debugging perl breakpoints constant-expression

0
推荐指数
1
解决办法
84
查看次数

表达式必须有常值问题

我在 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

0
推荐指数
1
解决办法
488
查看次数

如何使“this”指针常量表达式?

这是我之前的问题的后续问题:为什么成员函数返回非静态数据成员而不是核心常量表达式?

该问题中提到的示例的简化版本是:

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),但我看不到 …

c++ this language-lawyer constant-expression

0
推荐指数
1
解决办法
304
查看次数

Common Lisp:解释器或编译器是否允许合并相同的常量表达式?

我正在阅读 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 中的其他地方是否已解决此问题?

如果允许合并相同的常量值,那么解释器和编译器是否允许不同?(即一个合并而另一个不合并。)

common-lisp constant-expression

0
推荐指数
1
解决办法
82
查看次数

C11和开关盒标签中的常量表达式评估

关注这个问题为什么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

c c++ constants switch-statement constant-expression

-5
推荐指数
1
解决办法
433
查看次数