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中引入?
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)
在我看来,从主题变量中获得的唯一好处就是节省了一些键盘笔触。
我的问题是:是否存在用例,其中主题变量比占位符变量方便得多?
在这里查看此问题的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++20 引入了模块。任何未在模块中导出的符号都具有模块内部链接。虽然未命名命名空间提供了一种机制,可以使未命名命名空间内的定义具有文件内部链接。这是否意味着当模块在 C++ 社区中成为普遍做法时,未命名的命名空间将变得毫无用处?
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添加一个锁定字段.或者他们已经这样做了?
该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。
考虑以下示例代码:
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中,可以将数据指针分配给void指针,然后将其转换回原始类型,该数据指针将被恢复.语言标准保证这种转换不会丢失信息.这通常意味着(不一定,但对大多数平台来说都是如此),void指针的大小与数据指针的大小相同.因此,可以指望这些事实使用void指针作为异构类型的一般指针,而void指针本身具有统一的大小和表示.例如,一个有一个void指针数组,其元素指向动态分配的不同类型的对象.构造这样的数组使某些事情变得方便.我的问题是:如何实现类似的东西,C++中的通用指针类型,它符合以下内容:(假设g_pointer是类名)
从任何指针类型构造,可以编写类似的代码
g_pointer g_ptr = g_pointer(new T())
Run Code Online (Sandbox Code Playgroud)恢复原始指针
T* ptr = g_ptr.recover(), or
auto* ptr = g_tr.recover()
Run Code Online (Sandbox Code Playgroud)更新:根据一些评论,上面的内容无法用C++完成,那就像是
recover<Type>(g_ptr)
Run Code Online (Sandbox Code Playgroud)
应该足够了,抛出异常Type不兼容.
g_pointer可以包含在std :: vector或plain数组中,这基本上就是指
sizeof(g_pointer) // a predetermined constant number,
Run Code Online (Sandbox Code Playgroud)
(更新:这总是如此,只要这样一个类可以正确实现,感谢指出.)
我刚刚发现了boost :: any,看看它的介绍看起来似乎可能是我想要的,尽管可能不是这样.所以任何熟悉boost :: any的人都欢迎发表评论.
更新:(回复一些评论)
更新:谢谢@Caleth,std :: any很棒.
使用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,),它会按预期工作。
如果这不是解释器的错误,那么这种看似奇怪的行为背后的原因是什么?
在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++ ×7
c++11 ×2
iostream ×2
bit-fields ×1
boost-any ×1
c++-modules ×1
c++20 ×1
list ×1
namespaces ×1
perl6 ×1
pointers ×1
pthreads ×1
python ×1
python-3.10 ×1
raii ×1
raku ×1
stdlaunder ×1
stdmutex ×1
tuples ×1