相关疑难解决方法(0)

VS2019最新更新:constexpr:FIXED字符串数组的“表达式未计算为常量”

注意:Stack Overflow 上有很多标题看起来非常相似的问题,但恕我直言,我发现没有一个问题实际上是重复的。

我多年来一直在我的项目中使用如下代码,没有出现任何问题。但是,自从最近更新 Visual Studio 2019(16.7.2 - 尽管可能16.7.1)以来,MSVC编译器已开始生成所示的错误(我将编译“标准”设置为 C++17 )。

#include <iostream>

class Foo {
public:
    Foo() { }
    static constexpr char Letters[6][10] = { "Alpha", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot" };
};

int main()
{
    Foo f;
    for (int i = 0; i < 6; ++i) std::cout << f.Letters[i] << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误(在行的左大括号处constexpr):

错误 C2131:表达式未计算为常量
消息:失败是由读取未初始化的符号引起的

clang-cl编译器继续接受代码,没有任何警告。

我对这个问题有一个相当“微不足道”的修复,如下所示:

class Foo {
public:
    Foo() { }
    inline static const char …
Run Code Online (Sandbox Code Playgroud)

c++ visual-c++ constexpr

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

为什么`constexpr向量`不允许在`consteval`函数中分配?

第四次编辑:原始问题标题是:

为什么constexpr说明符不允许非空std::vector

正如 @Barry 指出的,这个标题与C++20 constexpr vector and string not working重复。但我的问题描述有所不同:我constexpr vectorconstevalfunction而不是正常的运行时 function 或constexprfunction中分配。

据我所知,在编译时计算期间,只允许瞬时分配,正如 @Barry 在链接问题中回答的那样。

我感到困惑的是:对于consteval功能:

  1. 它的任何局部变量将在返回后被释放
  2. 它只在编译时返回,因为它只会在编译时被调用
  3. soconstexpr vector作为局部变量,将在编译时释放
  4. 那么为什么不允许呢?

我在下面的其他编辑回答了这个困惑。

-----------------以下是原问题描述----------

为什么下面的代码不能编译:

consteval int foo() {
  constexpr std::vector<int> vec{1};
  return vec[0];
}
Run Code Online (Sandbox Code Playgroud)

据我所知,只要分配和释放都发生在编译时,就可以在编译时使用 和std::vectorstd::string如果我删除constexpr说明符,该代码将编译。

但是添加constexpr仍然不违反这个规则,对吗?为什么不允许?

使用 gcc 13 编译时出现此错误,但我不明白:

/opt/compiler-explorer/gcc-13.1.0/include/c++/13.1.0/bits/allocator.h:195:52: error:
'std::vector<int>(std::initializer_list<int>{((const int*)(& …
Run Code Online (Sandbox Code Playgroud)

c++ constexpr c++20

6
推荐指数
0
解决办法
249
查看次数

c++20 似乎不支持 constexpr 矢量 - 我的安装是否不正确

我刚刚在 ubuntu 20.04 上将编译器升级到 C++20。g++ version给我以下输出:

\n
c++ (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0\n
Run Code Online (Sandbox Code Playgroud)\n

我正在按照stackoverflow上的建议尝试以下代码

\n
constexpr int f() {\n    std::vector<int> v = {1, 2, 3};\n    return v.size();\n}\n\nint main() {\n    static_assert(f() == 3);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但我收到以下错误:

\n
error: variable \xe2\x80\x98v\xe2\x80\x99 of non-literal type \xe2\x80\x98std::vector<int>\xe2\x80\x99 in \xe2\x80\x98constexpr\xe2\x80\x99 function\n
Run Code Online (Sandbox Code Playgroud)\n

我是不是哪里出错了。或者是我的安装不正确

\n

c++ constexpr c++20

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

标签 统计

c++ ×3

constexpr ×3

c++20 ×2

visual-c++ ×1