【问题标题】:type for aliasing constexpr char[]用于别名 constexpr char[] 的类型
【发布时间】:2022-10-13 12:58:33
【问题描述】:

修改了问题以使其清楚。对不起我草率的英文措辞。

我正在寻找一个变量的类型,它是另一个constexpr char [] 类型的变量的别名。我尝试了一些,但没有一个奏效。

这是一个例子:

constexpr char FieldX[] = "source";
WhatType OptY = FieldX; 

FieldX 的值在运行时不会改变——显然。但是,稍后,有人可以在源代码中更改它并重新编译。我想避免必须根据FieldX 值的变化手动更改OptY 的值。

它们具有基本相同的值;它们位于不同的.cc/.cpp 文件中,如果变量的名称可以不同,它们的可读性会更好。

【问题讨论】:

  • 创建一个常量或非常量左值引用?这就是我们将引用称为别名的原因。

标签: c++ reference alias


【解决方案1】:

如果你想要一个变量的别名,你想要一个参考.

constexpr char FieldX[] = "my_field_or_option";
constexpr auto& OptY = FieldX;

static_assert( sizeof FieldX == 19 );
static_assert( sizeof OptY == 19 );    // No array decay

请注意FieldX必须在编译时进行评估,以便能够创建对它的 constexpr 引用,这意味着它应该是全局的或 static

Demo

【讨论】:

  • @JasonLiam 希望我的编辑能证明这段代码是有效的 C++(并抑制了反对票)。
  • @DrewDormann 是的,现在有了注释,没关系。
  • 谢谢!我想我尝试了几种不同的显式类型,而不是auto&,但没有奏效。 ``` int x;自动&参考 = x; ``` 上面,refint& 类型。在您的回答中,OptY 的类型是什么?再次感谢你!
  • @斯蒂芬constexpr const char (&OptY)[19] = FieldX;。或者只是constexpr const char *OptY = FieldX;,如果您不需要sizeof 以同样的方式工作。
【解决方案2】:

我希望OptYconstexpr char[] 一样有效

使用现代 C++,您可以使用decltype,如下所示:

constexpr char FieldX[] = "my_field_or_option";
using OptY = decltype(FieldX);     //create an alias
static_assert(sizeof(OptY) == 19);

Demo

如果你想给变量取别名,那么你可以使用 const lvalue 引用。请注意,要使其正常工作,FieldX 应该是 static 或全局变量。

constexpr char FieldX[] = "my_field_or_option";
constexpr auto& OptY = FieldX;

【讨论】:

  • OptY 不是 FieldX 的别名。它是const char[19] 的别名。
  • @n.1.8e9-where's-my-sharem。请注意,这就是 OP 想要的。特别是,他们写了“我希望OptYconstexpr char[] 一样有效.同样的事情写在问题的标题中。
  • 不,这不是 OP 想要的。这只是他们草率的措辞。再次阅读问题。 OP想要别名变量,并且这些别名需要是常量表达式.类型不能是 constexpr。
猜你喜欢
  • 2023-03-15
  • 2019-02-13
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 2013-12-20
相关资源
最近更新 更多