小编upd*_*liu的帖子

编写在C++ 11中拥有STL容器的类的构造函数的最佳方法

class Foo {
  std::vector<SomeType> data_;
};
Run Code Online (Sandbox Code Playgroud)

Say Foo只能通过制作一个对象的副本(技术上是指复制或移动)来std::vector<SomeType>构造.编写构造函数的最佳方法是Foo什么?

我的第一感觉是

Foo(std::vector<SomeType> data) noexcept : data_(std::move(data)) {};
Run Code Online (Sandbox Code Playgroud)

使用它,构造实例需要0或1次矢量复制,具体取决于{data}的参数是否可移动.

constructor move c++11

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

在C++中使用临时对象作为默认参数是否安全?

例如:

int StrLen(const std::string &s = "default string") {
  const std::string &t = "another string";  // BTW, is this line safe?
  return s.size();
}
Run Code Online (Sandbox Code Playgroud)

更新

SoapBox的结论是正确的,但原因并不完全正确.

临时的生命周期自动扩展为与持有它的引用相同.

除了几个例外,这通常是正确的.一个就是那个

"函数调用中与引用参数的临时绑定一直持续到包含调用的完整表达式完成为止."

我认为这个例外适用于默认参数情况.

另一个例外与SoapBox的答案中的另一个例子有关:

"函数返回语句中返回值临时绑定的生命周期未扩展;临时值在return语句中的full-expression结束时被销毁."

c++ language-lawyer

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

"int a = int();" 一定给我零?

是否int a = int();一定给我一个零?

怎么样,如果int被取代char,double,bool或指针类型?

请问在语言标准中指定了哪里?

c++

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

std :: nth_element(a.begin(),a.end(),a.end())有什么影响?

std::nth_elementhttp://www.sgi.com/tech/stl/nth_element.html上阅读了说明

template <class RandomAccessIterator>
void nth_element(RandomAccessIterator first, RandomAccessIterator nth,
                 RandomAccessIterator last);
Run Code Online (Sandbox Code Playgroud)

请注意,前提条件是

  1. [first,nth]是有效范围.
  2. [nth,last)是有效范围.

我的问题是:

打电话有效std::nth_element(a.begin(), a.end(), a.end())吗?如果是这样,它的影响是什么?无论如何,它并没有违反上述先决条件.语言标准(或其他文档)中的任何地方都声明nth必须指向一个元素a

c++ stl

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

条件表达式如何比较字符串?

#!/usr/bin/env bash
echo 'Using conditional expression:'
[[ ' ' < '0' ]] && echo ok || echo not ok
[[ ' a' < '0a' ]] && echo ok || echo not ok
echo 'Using test:'
[ ' ' \< '0' ] && echo ok || echo not ok
[ ' a' \< '0a' ] && echo ok || echo not ok
Run Code Online (Sandbox Code Playgroud)

输出是:

Using conditional expression:
ok
not ok
Using test:
ok
ok
Run Code Online (Sandbox Code Playgroud)

bash --version: GNU bash, version 4.2.45(1)-release (x86_64-pc-linux-gnu) …

bash

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

为什么OPENSSL_cleanse看起来如此复杂且线程不安全?

这是OpenSSL 1.0.1i中OPENSSL_cleanse的实现

unsigned char cleanse_ctr = 0;

void OPENSSL_cleanse(void *ptr, size_t len)
{
    unsigned char *p = ptr;
    size_t loop = len, ctr = cleanse_ctr;
    while(loop--)
    {
        *(p++) = (unsigned char)ctr;
        ctr += (17 + ((size_t)p & 0xF));
    }
    p=memchr(ptr, (unsigned char)ctr, len);
    if(p)
        ctr += (63 + (size_t)p);
    cleanse_ctr = (unsigned char)ctr;
}
Run Code Online (Sandbox Code Playgroud)

它看起来很复杂且线程不安全(通过读写全局变量cleanse_ctr).有人可以解释一下这个实现吗?用户是否需要关注其中可能的数据竞争?

c multithreading openssl

7
推荐指数
2
解决办法
2861
查看次数

在python中分离类定义和实现

我是Python初学者,我的主要语言是C++.您知道在C++中,将类的定义和实现分开是很常见的.(How)Python会这样做吗?如果没有,如何获得一个类的接口的干净的配置文件?

python

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

如何检查缓冲区是否为空?

如何检查缓冲区是否为空?count-lines我认为检查是否为0是过度杀戮.

更新: 是的,菲尔斯的答案应该有效.把它写出来:

(defun buffer-empty-p (&optional buffer)
  (= (buffer-size buffer) 0))
Run Code Online (Sandbox Code Playgroud)

emacs elisp

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

我可以使用堆栈协程作为在非常堆栈的协程中定义的steady_timer的等待处理程序吗?

我可以使用堆栈协程并boost::asio::steady_timer::async_wait以下列方式吗?重点是(我的理解,不确定)在等待期间,局部变量timer不在堆栈上,因此无法访问.那么回调能否正常进行?(仅供参考,使用clang ++ 5.0在我的Mac上运行正常.)

boost::asio::io_service io;
void Work(boost::asio::yield_context yield) {
  boost::asio::steady_timer timer(io);

  timer.expires_from_now(std::chrono::seconds(5));
  timer.async_wait(yield);

  cout << "Woke up." << endl;
}

int main() {
  boost::asio::spawn(io, Work);
  io.run();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我认为值得对这个问题进行比较:提升asio deadline_timer

c++ boost boost-asio

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

绑定到引用时临时对象生命周期扩展异常的基本原理是什么?

在C++ 11标准的12.2中:

绑定引用的临时对象或绑定引用的子对象的完整对象的临时对象在引用的生命周期内持续存在,除了:

  1. 绑定到构造函数的ctor-initializer(12.6.2)中的引用成员的临时绑定将持续存在,直到构造函数退出.

  2. 函数调用(5.2.2)中的引用参数的临时绑定将持续到包含该调用的完整表达式完成为止.

  3. 函数返回语句(6.6.3)中返回值临时绑定的生命周期未扩展; 临时在return语句中的full-expression结束时被销毁.

  4. 在new-initializer(5.3.4)中对引用的临时绑定将持续到包含new-initializer的full-expression完成为止.

并且标准中有最后一个案例:

struct S {
  int mi; 
  const std::pair<int,int>& mp;
}; 
S a { 1,{2,3} };  // No problem.
S* p = new S{ 1, {2,3} };  // Creates dangling reference
Run Code Online (Sandbox Code Playgroud)

对我而言,2. and 3.理解并容易达成一致.但是原因是1. and 4.什么?这个例子对我来说看起来很邪恶.

c++ object-lifetime temporary-objects c++11

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