小编Bik*_*eev的帖子

使用已删除的构造函数进行C++ 14值初始化

我有一些误解:

让我们将struct A的默认构造函数标记为已删除:

struct A
{
  A() = delete;
};
Run Code Online (Sandbox Code Playgroud)

下一条指令格式正确,有什么影响?:

A a{};
Run Code Online (Sandbox Code Playgroud)

cppreference 值启动:

1)如果T是没有默认构造函数的类类型,或者是用户提供的默认构造函数或者删除了默认构造函数,则该对象是默认初始化的.

但是然后默认初始化的效果是:

如果T是类类型,则调用默认构造函数以提供新对象的初始值.

或者它是聚合初始化?谢谢!

c++ language-lawyer c++14

39
推荐指数
2
解决办法
2428
查看次数

具有非静态成员初始值设定项的类的C++ 11聚合初始化

是否允许标准:

struct A
{
  int a = 3;
  int b = 3;
};

A a{0,1}; // ???
Run Code Online (Sandbox Code Playgroud)

这个课程仍然是聚合的吗? clang接受此代码,但gcc不接受.

c++ gcc aggregate-initialization c++11 c++14

33
推荐指数
1
解决办法
6519
查看次数

传递临时std :: string时的string_view行为

我只是遇到了一些误解:至少在libc ++实现中,std :: experimental :: string_view具有以下简洁的实现:

template <class _CharT, class _Traits....>
class basic_string_view {
public:
   typedef _CharT value_type;
   ...
   template <class _Allocator>
   basic_string_view(const basic_string<_CharT, _Traits, _Allocator>& str):
       __data(str.data()), __size(str.size())
   {
   }

private:
   const value_type* __data;
   size_type __size;
};
Run Code Online (Sandbox Code Playgroud)

这个实现是否意味着如果我们将rvalue表达式传递给这个构造函数,在构造之后使用__data时我们会得到未定义的行为?

c++ string c++11 fundamentals-ts string-view

10
推荐指数
1
解决办法
2080
查看次数

C++非类型模板参数const char*

让我们说我们有

template <const char*>
struct A{};

// static storage
const char a[] = "asd";
const char* p = "asd";
Run Code Online (Sandbox Code Playgroud)

这个实例化

A<a>{};
Run Code Online (Sandbox Code Playgroud)

对编译器没问题.这是可以理解的 - 数组a衰减指向第一个元素.但是,如果我们实例Ap这样的

A<p>{};
Run Code Online (Sandbox Code Playgroud)

编译器给出错误:

错误:类型为'char*'的非类型模板参数不是常量表达式

为什么标准不允许指定类型的命名变量const char*或只是字符串文字"asd",即btw左值本身,作为模板参数?

c++ templates

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

C++聚合类中元素初始化的顺序

我知道,在聚合课程中

每个数组元素或非静态类成员,按照类定义中的数组下标/外观的顺序,从初始化列表的相应子句进行复制初始化.

但我的问题是:我们可以在初始化中使用先前初始化的元素吗?喜欢:

std::array<int, 2> d = { 3, d[0] };
Run Code Online (Sandbox Code Playgroud)

要么

int d[] = {3, d[0]};
Run Code Online (Sandbox Code Playgroud)

谢谢!

c++ arrays initialization c++11

7
推荐指数
0
解决办法
68
查看次数

比较有符号和无符号字符

看起来很奇怪。我发现误会了。我使用 gcc 和 char 作为签名字符。我一直认为,在比较表达式(和其他表达式)中,如果需要,有符号值会转换为无符号值。

int a = -4;
unsigned int b = a;
std::cout << (b == a) << std::endl; // writes 1, Ok
Run Code Online (Sandbox Code Playgroud)

但问题是

char a = -4;
unsigned char b = a;
std::cout << (b == a) << std::endl; // writes 0
Run Code Online (Sandbox Code Playgroud)

如果比较运算符不仅仅是按位,那么它的魔力是什么?

c c++ unsigned-char

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

提高序列化按位序列化能力

我期望从 is_bitwise_serialized 特性中序列化类,如下所示(没有序列化函数):

class A { int a; char b; };
BOOST_IS_BITWISE_SERIALIZABLE(A);
A a{2, 'x'};
some_archive << a; // serializes a bitwisely
Run Code Online (Sandbox Code Playgroud)

我想知道,为什么需要为bitwise_serialized类提供序列化函数?

c++ serialization boost

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

具有默认参数的函数的C++部分排序

请考虑以下代码:

template <class...>
using void_t = void;

template <class T>
void bar(T){}

template <class T>
void bar(T, void_t<decltype(std::declval<T>().foo())>* = 0) {}

struct A { void foo(); } a;
bar(a); // gives a compiler error on ambiguous call
Run Code Online (Sandbox Code Playgroud)

所以问题是,为什么这些过载模糊不清?为什么第二次重载不被认为是更严格的,比编译器更专业的第二次?

c++ templates c++11

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

减去指针时的 C++ 未定义行为

C++ 标准从非数组元素中减去指针是 UB:

int a, b;
&a - &b; // UB, since pointers don't point to the same array.
Run Code Online (Sandbox Code Playgroud)

但是如果两个指针都被转换为 uintptr_t,那么两个表达式都不再是指针表达式,从标准的角度来看,减去它们似乎是合法的:

int a, b;
reinterpret_cast<uintptr_t>(&a) - reinterpret_cast<uintptr_t>(&b); 
Run Code Online (Sandbox Code Playgroud)

这是正确的还是我错过了什么?

c++

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

内联命名空间和不明确的声明

我想知道是否允许这样做:

namespace A {
  inline namespace B {
    int a;
  }
  int a;
}

void foo() {
  A::a = 0; // clang 3.4 compiles, but gcc doesn't
}
Run Code Online (Sandbox Code Playgroud)

标准说,那

最后,通过显式限定(3.4.3.2)查找封闭命名空间中的名称将包括using-directive引入的内联命名空间的成员,即使在封闭命名空间中存在该名称的声明也是如此.

但我无法得到它.

c++ namespaces language-lawyer c++11

3
推荐指数
1
解决办法
187
查看次数

cmpeqpd 有时会返回错误的值

出于某种原因,有时在我的程序中我看到

cmpeqpd xmm3,xmm0
Run Code Online (Sandbox Code Playgroud)

where xmm0 == {0x2cd000000000, 0x2cd000000000} andxmm3 == {0x0, 0x2011d0800000000} 恰好{0xffffffffffffffff, 0x0}在 xmm3 中返回,这是错误的,因为(double)0x0不等于(double)0x2cd000000000.

我注意到它只是偶尔发生。我已经用 rr 记录了程序的执行,以便一致地重现它。有趣的是,在一个超级简化的简单程序中,我无法再重现这个问题。我想知道,是否有任何隐藏的微架构状态可以改变 cmpeqpd (cmppd) 行为?

请注意,我检查了相应 ymm 寄存器中的高 128 位是否为零。

floating-point assembly sse avx denormal-numbers

3
推荐指数
1
解决办法
74
查看次数

C++在调用时指定非模板化的函数版本

我想知道,有没有办法强制调用非模板函数,如:

template <class T>
void foo(T&);

void foo(const int&);

void bar()
{
   int a;
   foo(a); // templated version is called, not a usual function
}
Run Code Online (Sandbox Code Playgroud)

c++ templates

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