小编wim*_*aan的帖子

与 C 相比,C++ 中无限循环没有副作用的好处是未定义行为?

在 C++ 循环中为

for(;;) {}
Run Code Online (Sandbox Code Playgroud)

是未定义的行为,但它们不在 C(?) 中。

在 P2809R0上。平凡的无限循环不是未定义的行为,它表示这样做有充分的理由。有没有一些简单的例子可以清楚地说明这一点?

c c++ optimization loops undefined-behavior

43
推荐指数
2
解决办法
3611
查看次数

在没有捕获的情况下访问lambda表达式中的constexpr变量

在下面的示例中,我可以从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++ lambda language-lawyer constexpr c++17

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

constexpr的等效三元运算符if?

也许我错过了一些东西,但我找不到任何提示: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)

c++ constexpr c++17 if-constexpr

27
推荐指数
2
解决办法
2970
查看次数

简单的概念检查

假设我有一个这样的简单模板:

template<typename T>
class A {};
Run Code Online (Sandbox Code Playgroud)

我想指定type-parameter T属于某种不相关的类型X<U>,其中U不知道(或不可指定).

有没有办法如何表达这个概念?

c++ c++-concepts

24
推荐指数
2
解决办法
2708
查看次数

使用reinterpret_cast 的示例不会触发UB

阅读https://en.cppreference.com/w/cpp/language/reinterpret_cast我想知道哪些用例reinterpret_cast不是 UB 并在实践中使用?

\n

上面的描述包含了许多将指针转换为其他类型然后再转换回来是合法的情况。但这似乎不太实用。通过指针访问对象reinterpret_cast大多是 UB,因为违反了严格别名(和/或对齐),除了通过char*/byte*指针访问之外。

\n

一个有用的例外是将整数常量转换为指针并访问目标对象,这对于操作硬件寄存器(在 \xc2\xb5C 中)很有用。

\n

谁能告诉我们在实践中使用的reinterpret_cast相关性的一些真实用例吗?

\n

c++ strict-aliasing undefined-behavior reinterpret-cast

24
推荐指数
2
解决办法
2296
查看次数

为什么在上下文转换中没有发生显式的bool()转换

如果以下测试程序

#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)

c++ operator-overloading c++11

16
推荐指数
1
解决办法
1455
查看次数

C++17 中 std::byte 只能按位运算?

CPP 参考文献中指出:

std::byte是一种独特的类型,它实现了 C++ 语言定义中指定的字节概念。

与 char 和 unsigned char 一样,它可用于访问其他对象(对象表示)占用的原始内存,但与这些类型不同的是,它不是字符类型,也不是算术类型。字节只是位的集合,并且只为其定义了按位运算符

但这不是真的:因为它是枚举类型,所以比较操作(<, <=, >, >=, ==, !=)也是可能的。

这是故意的吗,例如std::byte也用作 等的密钥std::map

c++ byte language-lawyer std-byte

15
推荐指数
1
解决办法
907
查看次数

GCC 无法报告格式错误的 constexpr lambda 调用

以下是未定义行为的两个测试用例,表示为 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++ undefined-behavior avr-gcc constexpr

9
推荐指数
1
解决办法
97
查看次数

在C++中编写自定义迭代器的首选方法17

从C++ 17开始继承自std::iterator<...>不推荐使用.相反,应该专门std::iterator_traits<...>为自己的迭代器类型.

我曾经把我的迭代器类写成它们所属的容器类中的嵌套类型.

尝试将std::iterator_traits<C<T>>导致部分专门化为T我的容器的值类型的不可导入的上下文C.

问题:我现在(从C++ 17开始)是否应该容器类之外定义迭代器类?

c++ iterator c++17

8
推荐指数
0
解决办法
3433
查看次数

为什么在std :: array size_t和std :: vector中的size_type通常是size_t?

该文档说,size_typestd::vector是/ usually / size_t,这是合理的,因为实现可以选择使用不同的东西。

但是为什么size_type = size_tstd::array。特别是在这里,因为std::array使用很少µC,所以最好使实现具有一定的自由度。

这是文档缺陷吗?

c++ size-t stdvector stdarray

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