您好我正在学习C++ 11,我想知道如何制作一个constexpr 0到n数组,例如:
n = 5;
int array[] = {0 ... n};
Run Code Online (Sandbox Code Playgroud)
所以阵列可能是 {0, 1, 2, 3, 4, 5}
作为在讨论这个SO问题时提出的一个问题:
申报对象是否合法,可能是N3471constexpr std::initializer_list?例:
constexpr std::initializer_list<int> my_list{};
Run Code Online (Sandbox Code Playgroud)
为什么我认为它可能不合法:initializer_list必须是字面类型; 但有没有保证它是文字类型?
来自N3485的引文.
[dcl.constexpr]/9:
对象声明中使用的constexpr说明符将对象声明为const.这样的对象应具有文字类型并应初始化.
文字类型要求,[basic.types]/10,子项目类类型:
- 具有以下所有属性的类类型(第9节):
- 它有一个简单的析构函数,
- 非静态数据成员(如果有)的brace-or-equal-initializers中的每个构造函数调用和完全表达式都是一个常量表达式(5.19),
- 它是一个聚合类型(8.5.1)或者至少有一个constexpr构造函数或构造函数模板,它不是复制或移动构造函数,并且
- 它的所有非静态数据成员和基类都是非易失性文字类型.
奖励积分;)用于回答if
constexpr std::initializer_list<int> my_list = {1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)
是合法的(有参考).虽然我认为上述+ [dcl.init.list]/5涵盖了这一点
是否可以使用constexpr?连接两个字符串文字?或者换句话说,可以在代码中消除宏,如:
#define nl(str) str "\n"
int main()
{
std::cout <<
nl("usage: foo")
nl("print a message")
;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
更新:使用没有任何问题"\n",但我想知道是否可以constexpr用来替换这些类型的宏.
如果所有成员std::tuple都是标准布局类型,那std::tuple本身就是标准布局吗?用户定义的复制构造函数的存在使它变得非常重要,但我想知道它是否仍然是标准布局.
从规范中引用会很好.
假设foo_t具有命名构造函数的类型,make_foo().现在,我想要真正拥有123个foo - 不多也不少.所以,我在考虑一个std::array<foo_t, 123>.现在,如果foo_t是默认构造的,我会写:
std::array<foo_t, 123> pity_the_foos;
std::generate(
std::begin(pity_the_foos), std::end(pity_the_foos),
[]() { return make_foo(); }
);
Run Code Online (Sandbox Code Playgroud)
而鲍勃是我的叔叔,对吗?不幸的是...... foo_t没有默认的ctor.
那么我应该如何初始化我的数组呢?我是否需要使用一些可变模板扩展伏都教?
注意:如果有帮助,答案可能会使用C++ 11,C++ 14或C++ 17中的任何内容.
下面的长显式初始化列表是否可以被生成它的某个模板替换?
std::array<Foo, n_foos> foos = {{
{0, bar},
{1, bar},
{2, bar},
{3, bar},
{4, bar},
{5, bar},
{6, bar},
{7, bar},
}};
Run Code Online (Sandbox Code Playgroud)
现在这里的代码只是因为我们有了constexpr int n_foos = 8.怎么能做到任意和大n_foos?