考虑这个课程:
class C1 {
C1(C1&&) = default; // declare and define move ctor
};
Run Code Online (Sandbox Code Playgroud)
因为C1的移动ctor在其第一个声明中被明确默认,所以标准的8.4.2告诉我们它具有相同的异常规范(ES),就好像该函数已被隐式声明一样.然后我们可以使用15.4/14和12.8/15来得出其ES的结论noexcept(true).
现在考虑一个C2相同的类,除了它的移动ctor在类定义之外默认:
class C2 {
C2(C2&&); // declare move ctor
};
C2::C2(C2&&) = default; // define move ctor
Run Code Online (Sandbox Code Playgroud)
C2移动ctor的ES是多少?因为它的第一次声明没有违约,所以8.4.2/2不适用.因为它没有明确的ES,所以8.4.2/3不适用.因为没有隐含声明,15.4/14不适用.据我所知,这意味着15.4/12适用,它表示默认函数ES是noexcept(false).
如果我是对的,这意味着C1中的移动ctor是noexcept(true),但C2中的概念相同的移动ctor是noexcept(false).
我对C2的推理是否正确?
在这里的介绍中,它指出Prolog的ISO模块标准是失败的.任何人都可以详细说明这个吗?
假设我想在编译时使用某种算法构建图形,然后计算图形中结束的节点数.这似乎是constexpr的理想情况,而不是模板元编程,因为目标是计算产生一个值,而不是真正的类型.我有一些有用的代码,但功能是如此新,我担心编译器是宽松的,我可以解释部分标准说我不能这样做.
#include <iostream>
struct A { int x; constexpr A(int i) noexcept : x{i} {} };
struct B { A& a; constexpr B(A& a) noexcept : a{a} {} };
constexpr int foo() {
A a{55};
B b{a};
return b.a.x;
}
template<int N>
void output()
{
std::cout << N << std::endl;
}
int main() {
// to be absolutely sure compile time eval'd,
// pass as template arg
constexpr auto b = foo();
output<b>();
}
Run Code Online (Sandbox Code Playgroud)
这两个a和b实例都是在编译时创建的,它们具有相同的生命周期,所以这应该是"安全的".但这a …
C++标准是否保证:
sizeof(uint8_t) <= sizeof(uint16_t) <= sizeof(uint32_t) <= sizeof(uint64_t)
sizeof(uint_least8_t) <= sizeof(uint_least16_t) <= sizeof(uint_least32_t) <= sizeof(uint_least64_t)
sizeof(uint_fast8_t) <= sizeof(uint_fast16_t) <= sizeof(uint_fast32_t) <= sizeof(uint_fast64_t)
Run Code Online (Sandbox Code Playgroud)
如果没有,它提供什么保证?(欢迎提取标准)
什么是bool保证返回?我可以依赖bool类型来解释为0或1吗?如果bool的数值解释在C99中不可靠,那么有一个标准吗?在依赖bool进行算术运算时,我在LLVM,GCC或Visual C++中应该注意什么?
举个例子,如果我这样做:
// An example of calculating a possible stride in bytes.
// hasData(), is8bit(), and is16bit() return as bool type
unsigned int stride = object->hasData() * object->size() *
(object->is8bit() * sizeof(uint8_t) +
object->is16bit() * sizeof(uint16_t));
Run Code Online (Sandbox Code Playgroud)
在示例中,我打赌bool类型只返回0或1.
所以问题是,最新标准是否指定标准C++库中的函数何时被内联声明?
望着algorithm从铛,GCC和MSVC的实现,每一个功能,除非是在constexpr的那些头文件,内联声明.
我会继续询问何时内联和什么不是,但我不想有关于编译器如何知道更好或微优化的通常论点,所以我可能不应该让这句话留在问题中.等一下...
有很多帖子问如何使表格视图单元格高度动态,我知道我可以做到HeightForRowAtIndexPath。
我的问题是这是否是好的做法。
似乎无法解决的问题是检查设备并硬编码高度,以便能够占用更多空间,比如说iPhone 6 plus。
是好的做法,还是应该做,还是有更好的办法?`
我试着寻找答案,但到目前为止还没有运气.我的问题是 - 为什么引用变量在定义时需要初始化?这是技术原因,还是标准不允许的?
以此代码为例:
int number = 42;
int& numberRef;
numberRef = number;
Run Code Online (Sandbox Code Playgroud)
以上是不允许的,但下面的代码是:
int number = 42;
int& numberRef = number;
Run Code Online (Sandbox Code Playgroud)
为什么编译器不能像未初始化的指针一样处理未初始化的引用变量?这里有什么我想念的吗?
如果我将无符号整数转换为有符号整数然后强制转换,我保证得到原始值吗?例如,这是否函数总是返回true任何x任何平台上根据C++标准?
bool f(unsigned int x)
{
return x == static_cast<unsigned int>(static_cast<int>(x));
}
Run Code Online (Sandbox Code Playgroud)
这个如何?
bool g(int x)
{
return x == static_cast<int>(static_cast<unsigned int>(x));
}
Run Code Online (Sandbox Code Playgroud)