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}的参数是否可移动.
例如:
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结束时被销毁."
是否int a = int();一定给我一个零?
怎么样,如果int被取代char,double,bool或指针类型?
请问在语言标准中指定了哪里?
我std::nth_element在http://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)
请注意,前提条件是
我的问题是:
打电话有效std::nth_element(a.begin(), a.end(), a.end())吗?如果是这样,它的影响是什么?无论如何,它并没有违反上述先决条件.语言标准(或其他文档)中的任何地方都声明nth必须指向一个元素a?
#!/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) …
这是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).有人可以解释一下这个实现吗?用户是否需要关注其中可能的数据竞争?
我是Python初学者,我的主要语言是C++.您知道在C++中,将类的定义和实现分开是很常见的.(How)Python会这样做吗?如果没有,如何获得一个类的接口的干净的配置文件?
如何检查缓冲区是否为空?count-lines我认为检查是否为0是过度杀戮.
更新: 是的,菲尔斯的答案应该有效.把它写出来:
(defun buffer-empty-p (&optional buffer)
(= (buffer-size buffer) 0))
Run Code Online (Sandbox Code Playgroud) 我可以使用堆栈协程并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++ 11标准的12.2中:
绑定引用的临时对象或绑定引用的子对象的完整对象的临时对象在引用的生命周期内持续存在,除了:
绑定到构造函数的ctor-initializer(12.6.2)中的引用成员的临时绑定将持续存在,直到构造函数退出.
函数调用(5.2.2)中的引用参数的临时绑定将持续到包含该调用的完整表达式完成为止.
函数返回语句(6.6.3)中返回值临时绑定的生命周期未扩展; 临时在return语句中的full-expression结束时被销毁.
在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.什么?这个例子对我来说看起来很邪恶.