相关疑难解决方法(0)

什么是聚合和POD以及它们如何/为何特殊?

常见问题解答涉及聚合和POD,并涵盖以下材料:

  • 什么是聚合
  • 什么是POD(普通旧数据)?
  • 它们有什么关系?
  • 它们如何以及为何特别?
  • C++ 11有什么变化?

c++ aggregate standard-layout c++11 c++17

525
推荐指数
6
解决办法
13万
查看次数

为什么这段代码会为不同的编译器生成不同的输出?

我有以下代码:

#include <iostream>
#include <vector>

struct C {
  int a;

  C() : a(0) {}
  C(int a) : a(a) {}
};

std::ostream &operator<<(std::ostream &os, const C &c) {
  os << c.a;
  return os;
}

using T = std::vector<C>;

int main() {
  auto v = T({5});

  for (const auto &a : v) {
    std::cout << a << ", ";
  }
  std::cout << std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我使用 g++,它会打印:

#include <iostream>
#include <vector>

struct C {
  int a;

  C() : a(0) {}
  C(int …
Run Code Online (Sandbox Code Playgroud)

c++ vector initializer-list compiler-specific direct-initialization

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

使用大括号初始化标量

在C和C++中,可以使用大括号初始化数组和结构:

int a[] = {2, 3, 5, 7};
entry e = {"answer", 42};
Run Code Online (Sandbox Code Playgroud)

然而,在2007年的一次演讲中,Bjarne提到这种语法也适用于标量.我尝试过这个:

int i = {7};
Run Code Online (Sandbox Code Playgroud)

它确实有效!允许使用大括号初始化标量的原理是什么?

注意:我特别不是在谈论C++ 11统一初始化.这是很好的旧C89和C++ 98.

c c++ initialization language-lawyer list-initialization

12
推荐指数
1
解决办法
1059
查看次数

来自 initalizer_list 的构造函数和来自需要转换的值的构造函数之间的重载解析,编译器存在分歧

在下面的代码中,struct A有两个构造函数:A(int)A(std::initializer_list<char>)。然后使用以下命令创建该结构的对象A({0})

#include <initializer_list>

struct A {
    int a;
    constexpr A(int) { a = 1; } 
    constexpr A(std::initializer_list<char>) { a = 2; }
};

static_assert( A({0}).a == 2 );
Run Code Online (Sandbox Code Playgroud)

事实证明,GCC 和 Clang 更喜欢这里的构造函数initializer_list(尽管int必须在 中转换参数char)并且整个程序被接受,但 MSVC 选择A(int)构造函数,导致static_assert. 演示: https: //gcc.godbolt.org/z/qx7W417Mv

这里是哪个编译器?

c++ initializer-list language-lawyer overload-resolution

5
推荐指数
1
解决办法
89
查看次数