我有一些误解:
让我们将struct A的默认构造函数标记为已删除:
struct A
{
A() = delete;
};
Run Code Online (Sandbox Code Playgroud)
下一条指令格式正确,有什么影响?:
A a{};
Run Code Online (Sandbox Code Playgroud)
1)如果T是没有默认构造函数的类类型,或者是用户提供的默认构造函数或者删除了默认构造函数,则该对象是默认初始化的.
但是然后默认初始化的效果是:
如果T是类类型,则调用默认构造函数以提供新对象的初始值.
或者它是聚合初始化?谢谢!
是否允许标准:
struct A
{
int a = 3;
int b = 3;
};
A a{0,1}; // ???
Run Code Online (Sandbox Code Playgroud)
这个课程仍然是聚合的吗?
clang接受此代码,但gcc不接受.
我只是遇到了一些误解:至少在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时我们会得到未定义的行为?
让我们说我们有
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衰减指向第一个元素.但是,如果我们实例A与p这样的
A<p>{};
Run Code Online (Sandbox Code Playgroud)
编译器给出错误:
错误:类型为'char*'的非类型模板参数不是常量表达式
为什么标准不允许指定类型的命名变量const char*或只是字符串文字"asd",即btw左值本身,作为模板参数?
我知道,在聚合课程中
每个数组元素或非静态类成员,按照类定义中的数组下标/外观的顺序,从初始化列表的相应子句进行复制初始化.
但我的问题是:我们可以在初始化中使用先前初始化的元素吗?喜欢:
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)
谢谢!
看起来很奇怪。我发现误会了。我使用 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)
如果比较运算符不仅仅是按位,那么它的魔力是什么?
我期望从 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类提供序列化函数?
请考虑以下代码:
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++ 标准说从非数组元素中减去指针是 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)
这是正确的还是我错过了什么?
我想知道是否允许这样做:
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引入的内联命名空间的成员,即使在封闭命名空间中存在该名称的声明也是如此.
但我无法得到它.
出于某种原因,有时在我的程序中我看到
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 位是否为零。
我想知道,有没有办法强制调用非模板函数,如:
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)