我正在学习用户定义的文字,并与以下测试代码混淆:
std::chrono::seconds operator"" _s(unsigned long long s) {
return std::chrono::seconds(s);
}
std::string operator"" _str(const char *s, std::size_t len) {
return std::string(s, len);
}
int main() {
auto str = "xxxxx"_str;
std::cout << str.size() << std::endl; // works
auto sec = 4_s;
std::cout << sec.count() << std::endl; // works
std::cout << "xxxxx"_str.size() << std::endl; // works
std::cout << 4_s.count() << std::endl; // does **NOT** work!
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器给出以下错误消息:
错误:没有匹配的文字运算符用于调用'operator'"_ s.count",其参数类型为'unsigned long long'或'const char*',并且没有匹配的文字运算符模板
cout << 4_s.count()<< endl ;
它似乎需要_s.count …
我们可以在函数内定义类/结构.我们还可以在函数内定义枚举和联合吗?
void fun() {
enum {BIG, MID, SMALL};
// other code.
}
Run Code Online (Sandbox Code Playgroud)
我可以使用gcc 4.8.2编译代码,但我不确定它是否合法.
是否标准保证string::erase和string::pop_backDO NOT重新分配内存?擦除一些元素后,是否string可能会自动缩小?
我检查了标准,它说,string::erase然后string::pop_back抛出std::out_of_range或扔掉任何东西.我可以将其作为这些方法不进行任何重新分配的保证吗?由于重新分配可能会抛出bad_alloc.
看来Kafka只允许使用者从leader代理(运行领导分区的代理)中提取消息。与的followers唯一同步leader,使用者无法从读取消息followers。
为什么不让消费者也从中提取消息followers呢?
我认为,如果使用者可以从中读取消息followers,我们可以进行负载平衡以从所有代理服务器中进行读取,并且整个系统的性能应该更好。说,leader太忙了,带宽leader成为了瓶颈。如果我们可以从提取消息followers,则性能应该会更好。
cppreference.com说The default constructor is defaulted。我还检查了C++14 draft,除了声明之外,它在默认构造函数上什么也没说:constexpr duration() = default;
当我运行下面的代码时,我感到很惊讶。
chrono::seconds s;
cout << s.count() << endl;
Run Code Online (Sandbox Code Playgroud)
每次运行它时,程序都会打印一些任意数字:140737364037104,140737078676496等等。
看来s初始化得不好。然后我检查了编译器(GCC 4.8)的std::chrono::duration. 该类有一个countint 类型的数据成员(即 ),没有任何类内初始值设定项。并且构造函数是默认构造的。所以数据成员实际上是未初始化的。这就是为什么程序总是打印一些任意数字。
以下是我的问题:
0, for std::chrono::duration?我得到以下代码:
sub deg2rad ($;$) { my $d = _DR * $_[0]; $_[1] ? $d : rad2rad($d) }
谁能告诉我什么$;$意思?
c ++标准是否保证使用std :: allocator构造不同的元素是线程安全的?例如:
// main thread
std::allocator<T> alloc;
auto *p = alloc.allocate(2);
// thread1
alloc.construct(p);
// thread2
alloc.construct(p + 1)
Run Code Online (Sandbox Code Playgroud)
另外,对于不同的元素,std :: allocator :: destroy是否是线程安全的?
谢谢!
如果我不打开任何编译器优化,以下代码工作正常.但是,如果我用优化编译它,它将核心转储,即-O2
string key = "hi";
auto il = {"get", key.c_str(), "ha"};
printf("%p\n", *(il.begin() + 1)); // the address of the second element is normal.
for (const auto &ele : il)
cout << ele << endl; // output is normal.
il = {"get", key.c_str()}; // <-- assignment
printf("%p\n", *(il.begin() + 1)); // now, the address is ABNORMAL!!!
for (const auto &ele : il)
cout << ele << endl; // <-- output is ABNORMAL.
Run Code Online (Sandbox Code Playgroud)
似乎编译器优化了对initializer_list的赋值,并使其无效.我用多个版本CLANG和GCC版本测试代码,它具有相同的行为.
我的问题是:
如果我有一个迭代器指向 STL 容器中的一个元素,并且我用迭代器移动了该元素,那么标准是否保证迭代器仍然有效?我可以将它与容器的方法一起使用吗container::erase?
容器是连续容器(例如 )vector还是非连续容器(例如 )也很重要吗list?
std::list<std::string> l{"a", "b", "c"};
auto iter = l.begin();
auto s = std::move(*iter);
l.erase(iter); // <----- is it valid to erase it, whose underlying element has been removed?
Run Code Online (Sandbox Code Playgroud)