相关疑难解决方法(0)

在C++ 11中创建N元素constexpr数组

您好我正在学习C++ 11,我想知道如何制作一个constexpr 0到n数组,例如:

n = 5;

int array[] = {0 ... n};
Run Code Online (Sandbox Code Playgroud)

所以阵列可能是 {0, 1, 2, 3, 4, 5}

c++ array-initialization constexpr c++11

56
推荐指数
4
解决办法
4万
查看次数

声明constexpr initializer_list对象是否合法?

作为在讨论这个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涵盖了这一点

c++ initializer-list language-lawyer constexpr c++11

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

Concat两个`const char`字符串文字

是否可以使用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用来替换这些类型的宏.

c++ string-literals c-preprocessor constexpr c++11

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

std :: tuple和标准布局

如果所有成员std::tuple都是标准布局类型,那std::tuple本身就是标准布局吗?用户定义的复制构造函数的存在使它变得非常重要,但我想知道它是否仍然是标准布局.

从规范中引用会很好.

c++ language-lawyer c++11

13
推荐指数
2
解决办法
1852
查看次数

初始化一个非默认可构造元素的std ::数组?

假设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中的任何内容.

c++ initialization default-constructor c++11 stdarray

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

如何使用常规构造函数模式初始化C++ 11标准容器?

下面的长显式初始化列表是否可以被生成它的某个模板替换?

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

c++ templates initializer c++11

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