在 C++ 循环中为
for(;;) {}
Run Code Online (Sandbox Code Playgroud)
是未定义的行为,但它们不在 C(?) 中。
在 P2809R0上。平凡的无限循环不是未定义的行为,它表示这样做有充分的理由。有没有一些简单的例子可以清楚地说明这一点?
在下面的示例中,我可以从lambda内部访问constexpr变量x,y而无需显式捕获它.如果x未声明为,则无法执行此操作constexpr.
是否有适用constexpr于捕获的特殊规则?
int foo(auto l) {
// OK
constexpr auto x = l();
auto y = []{return x;};
return y();
// NOK
// auto x2 = l();
// auto y2 = []{ return x2; };
// return y2();
}
auto l2 = []{return 3;};
int main() {
foo(l2);
}
Run Code Online (Sandbox Code Playgroud) 也许我错过了一些东西,但我找不到任何提示:C++ 17中有一个constexpr三元运算符,相当于constexpr-if?
template<typename Mode>
class BusAddress {
public:
explicit constexpr BusAddress(Address device) :
mAddress(Mode::write ? (device.mDevice << 1) : (device.mDevice << 1) | 0x01) {}
private:
uint8_t mAddress = 0;
};
Run Code Online (Sandbox Code Playgroud) 假设我有一个这样的简单模板:
template<typename T>
class A {};
Run Code Online (Sandbox Code Playgroud)
我想指定type-parameter T属于某种不相关的类型X<U>,其中U不知道(或不可指定).
有没有办法如何表达这个概念?
阅读https://en.cppreference.com/w/cpp/language/reinterpret_cast我想知道哪些用例reinterpret_cast不是 UB 并在实践中使用?
上面的描述包含了许多将指针转换为其他类型然后再转换回来是合法的情况。但这似乎不太实用。通过指针访问对象reinterpret_cast大多是 UB,因为违反了严格别名(和/或对齐),除了通过char*/byte*指针访问之外。
一个有用的例外是将整数常量转换为指针并访问目标对象,这对于操作硬件寄存器(在 \xc2\xb5C 中)很有用。
\n谁能告诉我们在实践中使用的reinterpret_cast相关性的一些真实用例吗?
\n如果以下测试程序
#include <iostream>
class A {
public:
A() {}
explicit operator bool() const {
std::cout << __PRETTY_FUNCTION__ << std::endl;
return true;
}
// explicit operator bool() {
// std::cout << __PRETTY_FUNCTION__ << std::endl;
// return true;
// }
const operator int() const {
std::cout << __PRETTY_FUNCTION__ << std::endl;
return 1;
}
operator int() {
std::cout << __PRETTY_FUNCTION__ << std::endl;
return 1;
}
};
int main() {
A a;
if (a) {
std::cout << "bool()" << std::endl;
}
if (a + …Run Code Online (Sandbox Code Playgroud) 以下是未定义行为的两个测试用例,表示为 IIFE(立即称为 Lambda-Axpression):
constexpr auto test3 = []{
int* p{};
{
int x{};
p = &x;
}
return *p; // Undefined Behaviour
}(); // IIFE
constexpr auto test4 = []{
int x = std::numeric_limits<int>::min();
int y = -x; // Undefined Behaviour
return y;
}();
int main() {}
Run Code Online (Sandbox Code Playgroud)
当使用 GCC 主干编译时,test4被正确拒绝,因为它在constexpr. 另一方面test3是接受。
GCC 是否有权接受test3?
从C++ 17开始继承自std::iterator<...>不推荐使用.相反,应该专门std::iterator_traits<...>为自己的迭代器类型.
我曾经把我的迭代器类写成它们所属的容器类中的嵌套类型.
尝试将std::iterator_traits<C<T>>导致部分专门化为T我的容器的值类型的不可导入的上下文C.
问题:我现在(从C++ 17开始)是否应该在容器类之外定义迭代器类?
该文档说,size_type的std::vector是/ usually / size_t,这是合理的,因为实现可以选择使用不同的东西。
但是为什么size_type = size_t在std::array。特别是在这里,因为std::array使用很少µC,所以最好使实现具有一定的自由度。
这是文档缺陷吗?