小编Joh*_* Li的帖子

为什么C ++ 20中引入了std :: ssize()?

C ++ 20引入了std::ssize()free函数,如下所示:

template <class C>
    constexpr auto ssize(const C& c)
        -> std::common_type_t<std::ptrdiff_t,
                              std::make_signed_t<decltype(c.size())>>;
Run Code Online (Sandbox Code Playgroud)

似乎可以使用实现static_cast,将size()cl ass C的成员函数的返回值转换为其已签名的对应函数。

由于size()C 的成员函数始终返回非负值,为什么有人会将它们存储在带符号的变量中?万一真的要,那很简单static_cast

为什么std::ssize()在C ++ 20中引入?

c++ c++20

92
推荐指数
2
解决办法
6823
查看次数

perl6占位符变量和主题变量

Perl 6中同时存在占位符变量和主题变量。例如,以下两个语句相同

say ( $_ * 2 for 3, 9 );        # use topic variables                 
say ( { $^i * 2 } for 3, 9 );   # use placeholder variables
Run Code Online (Sandbox Code Playgroud)

在我看来,从主题变量中获得的唯一好处就是节省了一些键盘笔触。

我的问题是:是否存在用例,其中主题变量比占位符变量方便得多?

perl6 raku

14
推荐指数
2
解决办法
147
查看次数

C ++中位字段如何与位填充相互作用

这里查看此问题的C版本。

当存在填充位时,我有两个关于位字段的问题。

说我有一个结构定义为

struct T { 
    unsigned int x: 1; 
    unsigned int y: 1;
};
Run Code Online (Sandbox Code Playgroud)

结构T仅实际使用了两位。

问题1:这两位始终是基础无符号int的最低有效位吗?还是取决于平台?

问题2:那些未使用的30位是否总是初始化为0?C ++标准对此有何评论?

c++ memory-layout language-lawyer bit-fields

6
推荐指数
1
解决办法
88
查看次数

C++ 模块是否会使未命名的命名空间变得多余?

C++20 引入了模块。任何未在模块中导出的符号都具有模块内部链接。虽然未命名命名空间提供了一种机制,可以使未命名命名空间内的定义具有文件内部链接。这是否意味着当模块在 C++ 社区中成为普遍做法时,未命名的命名空间将变得毫无用处?

c++ namespaces unnamed-namespace c++-modules

6
推荐指数
1
解决办法
428
查看次数

如何自动将流模式设置回默认值

C++ steam对象具有状态.如果一个人写一段代码就好

using namespace std; 
cout << hex << setw(8) << setfill('0') << x << endl;
Run Code Online (Sandbox Code Playgroud)

忘记设置流状态.这将导致其他一些不相关的代码出现问题.进行"设置"和"后退"对匹配是很繁琐的.除此之外,在我看来,这也违背了RAII背后的惯例.

我的问题是:只有一层薄薄的包裹才有可能使这些状态操作成为类RAII.也就是说,在分号表达式结束后,流状态会自动设置回默认值.

更新:按照@ 0x499602D2提供的链接,可能会有一个解决方法

#include <boost/io/ios_state.hpp>
#include <ios>
#include <iostream>
#include <ostream>
#define AUTO_COUT(x) {\
    boost::io::ios_all_saver  ias( cout );\
    x;\
    }while(0)
Run Code Online (Sandbox Code Playgroud)

然后就可以使用宏了

AUTO_COUT(cout << hex << setw(8) << setfill('0') << x << endl);
Run Code Online (Sandbox Code Playgroud)

顺便说一下,如果在多线程程序中出现有趣的事情,最好为那些保护类的boost :: io :: ios_state添加一个锁定字段.或者他们已经这样做了?

c++ iostream raii

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

为什么 C++ 中 std::mutex 的构造函数不抛出?

pthread_mutex_init()函数在无法初始化互斥锁时返回一个非零值,而std::mutexC++11 中的类的构造函数为noexcept.

假设一个人选择在 pthreads 互斥体之上实现一个 C++ 互斥体类。他在类中包装了一个 pthread 互斥锁,并尝试通过在构造函数中调用 pthread_mutex_init() 来初始化它。如果函数调用返回非零值,表示错误,则无法立即报告错误,因为构造函数无法抛出。一种替代方法是抛出异常,直到在互斥锁上实际调用锁定方法。但这种方法似乎是错误的。

有没有另一种方法可以做到这一点,使用一些聪明的技巧来保证初始化互斥锁总是成功的?

更新:我将在这个问题上回答我自己的问题。根据语言标准,在 30.4.1.3 pge 1163 中,它说“如果互斥类型的对象初始化失败,将抛出 system_error 类型的异常。”

而 noexcept 的函数可以在函数体内抛出,只是调用者无法捕获异常。如果在 noexcept 函数内抛出异常,则将调用 std::terminate。

pthreads c++11 stdmutex

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

std::launder 的效果是否在调用它的表达式之后持续?

考虑以下示例代码:

struct X { const int n; };
union U { X x; float f; };
void fun() {
  U u = {{ 1 }};
  u.f = 5.f;               // OK, creates new subobject of 'u'
  X *p = new (&u.x) X {2}; // OK, creates new subobject of 'u'
  
  if(*std::launder(&u.x.n) == 2){// condition is true because of std::launder
    std::cout << u.x.n << std::endl;  //UB here?
    }
}
Run Code Online (Sandbox Code Playgroud)

函数会fun根据语言标准打印什么?换句话说,std::launderlast 的效果是否超出了它被调用的表达式?std::launder或者,我们每次需要访问更新后的值时都必须使用u.x.n?

c++ compiler-optimization language-lawyer stdlaunder

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

如何在C++中实现通用指针类型

在C中,可以将数据指针分配给void指针,然后将其转换回原始类型,该数据指针将被恢复.语言标准保证这种转换不会丢失信息.这通常意味着(不一定,但对大多数平台来说都是如此),void指针的大小与数据指针的大小相同.因此,可以指望这些事实使用void指针作为异构类型的一般指针,而void指针本身具有统一的大小和表示.例如,一个有一个void指针数组,其元素指向动态分配的不同类型的对象.构造这样的数组使某些事情变得方便.我的问题是:如何实现类似的东西,C++中的通用指针类型,它符合以下内容:(假设g_pointer是类名)

我刚刚发现了boost :: any,看看它的介绍看起来似乎可能是我想要的,尽管可能不是这样.所以任何熟悉boost :: any的人都欢迎发表评论.

更新:(回复一些评论)

  • g_pointer类型对象应该知道它指向的对象的基础类型.因此,recover方法应始终返回该类型的指针.
  • 一般指针类型,意味着对任何对象的引用,恕我直言,对任何支持面向对象范式的语言都是合理的.

更新:谢谢@Caleth,std :: any很棒.

c++ pointers boost-any heterogeneous-array

4
推荐指数
1
解决办法
702
查看次数

为什么 Python 将列表匹配为元组?

使用Python 3.11.0a2+,以及以下代码:

def my_fun(e):
    match e:
        case (1,):
            print("tuple (1,)")
        case [1]:
            print("list [1]")
        case _:
            print("I don't understand")
Run Code Online (Sandbox Code Playgroud)

使用my_fun([1])打印“tuple (1,)”调用该函数。

这种行为正确吗?

如果我明确匹配tuple((1, ))而不是(1,),它会按预期工作。

如果这不是解释器的错误,那么这种看似奇怪的行为背后的原因是什么?

python tuples list pattern-matching python-3.10

4
推荐指数
1
解决办法
1451
查看次数

为什么C++ 11将运算符bool添加到ios类中

在C++ 98中,ios类中有一个公共函数定义为

operator void*() const;
Run Code Online (Sandbox Code Playgroud)

operator bool在C++ 11中将An 添加到类中,即

explicit operator bool() const;
Run Code Online (Sandbox Code Playgroud)

从阅读参考文献来看,我不清楚为什么这operator bool是必要的.

任何人都可以给出一个operator void*导致问题的例子,同时operator bool工作得很好吗?

c++ iostream c++11

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