为什么必须在运行时构造字符串?

乔纳森·米

可以在运行时创建C-String或std::strings,constexpr还是必须在运行时创建它们?

使用gcc 4.9.2,我可以这样做:

constexpr const char foo[] = "blee";

(遗憾的是,2013年11月客户技术预览版不允许Visual Studio支持此功能:https : //stackoverflow.com/a/29255013/2642059

但是即使使用gcc 4.9.2,我也无法做到这一点:

constexpr const std::string foo = "blee";

我得到错误:

error: the type 'const string {aka const std::basic_string<char>}' of constexpr variable 'foo' 
       is not literal

 constexpr const std::string foo = "blee";
                                   ^
note: 'std::basic_string<char>' is not literal because:
     class basic_string
           ^
note:   'std::basic_string<char>' has a non-trivial destructor

但是,我想进一步说明为什么astd::string不是文字。就是说:为什么必须在运行时构造一个字符串?

正如指出的那样,可以通过以下方式部分地解决此问题:是否可以在constexpr中使用std :: string?但是它没有涉及为什么std::string不能成为问题核心的文字。

沙菲克·雅格慕(Shafik Yaghmour)

有一个关于constexpr字符串的建议编译时字符串:std :: string_literal,它说:

std::string_literal类似于的目的std::string是提供一种用于处理文本的便捷实用程序。与不同std::string,的实例化std::string_literal是一种文字类型,因此可以在编译时使用。也就是说,它可以是constexpr对象的类型,也可以是参数的类型,返回值或constexpr函数的局部变量

这也证实确实std::string不是文字类型

那么,为什么不只创建std::string一个文字类型呢?

我们从上面的提案中得到了一个提示,为什么不能做到这一点:

这将需要进行大量的核心语言更改,以使诸如动​​态内存之类的东西在编译时可用,或者使诸如VLA / ARB之类的东西成为文字类型。鉴于Rapperswil Evolution不仅对N4025(运行时大小的类)而且对任何模糊不清的VLA / ARB都产生了强烈的负面反应,所以我们可以期望这种情况不会很快发生,因此这个主意是不可能的。

std::string 需要动态内存,该内存在编译时不可用。

为什么constexpr不能应用于std :: string但可以应用于char数组

constexpr应用于对象的字面类型不适用于std::string数组const char从C ++ 11标准草案7.1.5 [dcl.constexpr]强调我的前进)中:

constexpr对象声明中使用说明符将该对象声明为const这样的对象应具有文字类型并应进行初始化如果它是通过构造函数调用初始化的,则该调用应为常量表达式(5.19)。[…]

并从3.9 [basic.types]部分开始

类型是文字类型,如果是:

包括:

  • 标量类型;或者
  • 文字类型数组

算术类型是标量类型,包括char,它覆盖了const char

对于课程:

具有以下所有属性的类类型(第9条):

  • 它有一个琐碎的破坏者,
  • 非静态数据成员(如果有)中的括号或相等初始化程序中的每个构造函数调用和全表达式都是一个常量表达式(5.19),
  • 它是聚合类型(8.5.1)或具有至少一个constexpr不是复制或移动构造函数的构造函数或构造函数模板,并且
  • 它的所有非static数据成员和基类都是文字类型。

std::string 不符合该条件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

创建仅包含字符串的JList的最简单方法(必须在运行时更改Jlist)

来自分类Dev

如何构造函数注入仅在运行时已知的字符串?(温莎城堡)

来自分类Dev

在运行时使用连接字符串

来自分类Dev

PyQt:在运行时转换模块字符串

来自分类Dev

尝试在运行时编辑字符串

来自分类Dev

Dapper 在运行时更改连接字符串

来自分类Dev

为什么在构造字符串时`std :: istreambuf_iterator <char>`被视为函数声明?

来自分类Dev

XamlParseException在运行时。从x:Static切换到相对组件字符串以引用图像可修复该问题。为什么?

来自分类Dev

XamlParseException在运行时。从x:Static切换到相对组件字符串以引用图像可修复该问题。为什么?

来自分类Dev

为什么在struct中使用字符串时出现运行时错误

来自分类Dev

从NULL构造字符串?

来自分类Dev

在运行时将字符添加到字符串末尾

来自分类Dev

为什么我在 PC^2 上出现运行时错误?(替换某些字符串中的某些单词或字符)

来自分类Dev

为什么必须在连接之前初始化javascript字符串变量

来自分类Dev

Groovy字符串插值,其值仅在运行时已知

来自分类Dev

如何在运行时更改NLog目标的连接字符串?

来自分类Dev

我可以在运行时通过评估字符串来创建函数吗?

来自分类Dev

字符串替换在运行时在Powershell脚本中不起作用

来自分类Dev

SQLite EF6在运行时以编程方式设置连接字符串

来自分类Dev

Azure Web服务-在运行时更改数据库连接字符串

来自分类Dev

在运行时确定字符串中Java表达式的返回类型

来自分类Dev

如何在运行时将字符串转换为代码

来自分类Dev

在运行时评估groovy字符串表达式

来自分类Dev

如何在运行时在Objective-C中查找字符串常量?

来自分类Dev

对于每个调用,在运行时将连接字符串传递给Entity Framework

来自分类Dev

实体框架-在运行时更改连接字符串(需要解释)

来自分类Dev

Castle和NLog在运行时更改连接字符串

来自分类Dev

如何在运行时将java中的字符串参数作为参数传递

来自分类Dev

在运行时更改连接字符串–这是正确的方法吗?

Related 相关文章

  1. 1

    创建仅包含字符串的JList的最简单方法(必须在运行时更改Jlist)

  2. 2

    如何构造函数注入仅在运行时已知的字符串?(温莎城堡)

  3. 3

    在运行时使用连接字符串

  4. 4

    PyQt:在运行时转换模块字符串

  5. 5

    尝试在运行时编辑字符串

  6. 6

    Dapper 在运行时更改连接字符串

  7. 7

    为什么在构造字符串时`std :: istreambuf_iterator <char>`被视为函数声明?

  8. 8

    XamlParseException在运行时。从x:Static切换到相对组件字符串以引用图像可修复该问题。为什么?

  9. 9

    XamlParseException在运行时。从x:Static切换到相对组件字符串以引用图像可修复该问题。为什么?

  10. 10

    为什么在struct中使用字符串时出现运行时错误

  11. 11

    从NULL构造字符串?

  12. 12

    在运行时将字符添加到字符串末尾

  13. 13

    为什么我在 PC^2 上出现运行时错误?(替换某些字符串中的某些单词或字符)

  14. 14

    为什么必须在连接之前初始化javascript字符串变量

  15. 15

    Groovy字符串插值,其值仅在运行时已知

  16. 16

    如何在运行时更改NLog目标的连接字符串?

  17. 17

    我可以在运行时通过评估字符串来创建函数吗?

  18. 18

    字符串替换在运行时在Powershell脚本中不起作用

  19. 19

    SQLite EF6在运行时以编程方式设置连接字符串

  20. 20

    Azure Web服务-在运行时更改数据库连接字符串

  21. 21

    在运行时确定字符串中Java表达式的返回类型

  22. 22

    如何在运行时将字符串转换为代码

  23. 23

    在运行时评估groovy字符串表达式

  24. 24

    如何在运行时在Objective-C中查找字符串常量?

  25. 25

    对于每个调用,在运行时将连接字符串传递给Entity Framework

  26. 26

    实体框架-在运行时更改连接字符串(需要解释)

  27. 27

    Castle和NLog在运行时更改连接字符串

  28. 28

    如何在运行时将java中的字符串参数作为参数传递

  29. 29

    在运行时更改连接字符串–这是正确的方法吗?

热门标签

归档