小编for*_*ack的帖子

为什么用户定义的字符串文字和整数文字具有不同的行为?

我正在学习用户定义的文字,并与以下测试代码混淆:

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 …

c++ user-defined-literals c++11

20
推荐指数
1
解决办法
2095
查看次数

我们可以在函数中定义枚举吗?

我们可以在函数内定义类/结构.我们还可以在函数内定义枚举联合吗?

void fun() {
    enum {BIG, MID, SMALL};
    // other code.
}
Run Code Online (Sandbox Code Playgroud)

我可以使用gcc 4.8.2编译代码,但我不确定它是否合法.

c++ enums

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

标准是否保证string :: erase和string :: pop_back不重新分配内存?

是否标准保证string::erasestring::pop_backDO NOT重新分配内存?擦除一些元素后,是否string可能会自动缩小?

我检查了标准,它说,string::erase然后string::pop_back抛出std::out_of_range或扔掉任何东西.我可以将其作为这些方法进行任何重新分配的保证吗?由于重新分配可能会抛出bad_alloc.

c++ string

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

为什么不让消费者从关注者那里获取消息呢?

看来Kafka只允许使用者从leader代理(运行领导分区的代理)中提取消息。与的followers唯一同步leader,使用者无法从读取消息followers

为什么不让消费者也从中提取消息followers呢?

我认为,如果使用者可以从中读取消息followers,我们可以进行负载平衡以从所有代理服务器中进行读取,并且整个系统的性能应该更好。说,leader太忙了,带宽leader成为了瓶颈。如果我们可以从提取消息followers,则性能应该会更好。

apache-kafka

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

std::chrono::duration 默认值是如何构造的?

cppreference.comThe default constructor is defaulted。我还检查了C++14 draft,除了声明之外,它在默认构造函数上什么也没说:constexpr duration() = default;

当我运行下面的代码时,我感到很惊讶。

chrono::seconds s;
cout << s.count() << endl;
Run Code Online (Sandbox Code Playgroud)

每次运行它时,程序都会打印一些任意数字:140737364037104140737078676496等等。

看来s初始化得不好。然后我检查了编译器(GCC 4.8)的std::chrono::duration. 该类有一个countint 类型的数据成员(即 ),没有任何类内初始值设定项。并且构造函数是默认构造的。所以数据成员实际上是未初始化的。这就是为什么程序总是打印一些任意数字。

以下是我的问题:

  1. 这是正确的行为吗?或者编译器应该为数据成员提供一个类内初始值设定项?
  2. 如果这是正确的行为,为什么标准不指定默认值,例如0, for std::chrono::duration

c++ c++11 c++-chrono

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

$; $在Perl函数定义中意味着什么?

我得到以下代码:

sub deg2rad ($;$) { my $d = _DR * $_[0]; $_[1] ? $d : rad2rad($d) }

谁能告诉我什么$;$意思?

perl

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

在构造不同的元素时,'std :: allocator <T> :: construct'是否是线程安全的?

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是否是线程安全的?

谢谢!

c++ multithreading c++11

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

编译器对initializer_list的赋值进行优化会使程序核心转储?

如果我不打开任何编译器优化,以下代码工作正常.但是,如果我用优化编译它,它将核心转储,即-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的赋值,并使其无效.我用多个版本CLANGGCC版本测试代码,它具有相同的行为.

我的问题是:

  1. 分配initializer_list是否有效? …

c++

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

当底层元素被移动后,迭代器仍然有效吗?

如果我有一个迭代器指向 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)

c++ move-semantics c++11

0
推荐指数
1
解决办法
238
查看次数