我知道这是一个经常被问到的问题,但由于有很多变种,我想重新陈述它,并希望有一个反映当前状态的答案.就像是
Logger& g_logger() {
static Logger lg;
return lg;
}
Run Code Online (Sandbox Code Playgroud)
变量lg的构造函数是否保证只运行一次?
我从以前的答案中知道,在C++ 03中,这不是; 在C++ 0x草案中,这是强制执行的.但我想要一个更明确的答案
我在我的项目中使用CMake并设置了一个用于连续/夜间构建的cdash服务器.一切运作良好,通过设置crontab,我们将每小时/每晚的构建/测试结果自动上传到我们的cdash服务器.
我的下一步是将测试覆盖率报告添加到构建中.我在http://www.cmake.org/Wiki/CTest:Coverage找到了这份文件,但坦率地说,它与实用指南相差甚远.
目前我已经添加了所需的标志(而不是-fprofile-arcs -ftest-coverage,我发现--coverage更好),编译过程生成.gcno文件.但后来我被卡住了.命令
make NightlyCoverage
Run Code Online (Sandbox Code Playgroud)
好像什么也没做.谁能告诉我接下来要做什么?我想要的结果是make NightlyCoverage,生成覆盖率报告并上传到cdash服务器.
我正在编写一个网络库,并大量使用移动语义来处理文件描述符的所有权.我的一个类希望接收其他类型的文件描述符包装并取得所有权,所以就像这样
struct OwnershipReceiver
{
template <typename T>
void receive_ownership(T&& t)
{
// taking file descriptor of t, and clear t
}
};
Run Code Online (Sandbox Code Playgroud)
它必须处理多个不相关的类型,所以receive_ownership必须是一个模板,为了安全起见,我希望它只绑定到右值引用,这样用户在传递左值时必须显式地声明std :: move.
receive_ownership(std::move(some_lvalue));
但问题是:C++模板推导允许在没有额外努力的情况下传递左值.我实际上是因为不小心将左值传递给receive_ownership并且稍后使用了左值(清除)而将自己击中一只脚.
所以这是一个问题:如何使模板仅绑定到右值参考?
假设我有一个非常简单的函数,我希望编译器能够内联它.但是我可能需要在看到一些无效输入时抛出异常,是否会阻止编译器内联函数?
我正在编写一个通用函数包装器,它可以将任何函数包装到具有该形式的lua样式调用中
int lua_function(lua_State*L)
我希望包装函数是即时生成的,所以我想将函数作为模板参数传递.如果你知道参数的数量(例如2),这是微不足道的:
template <typename R, typename Arg1, typename Arg2, R F(Arg1, Args)>
struct wrapper
Run Code Online (Sandbox Code Playgroud)
但是,我不知道这个数字,所以我请求variadic模板参数求助
// This won't work
template <typename R, typename... Args, R F(Args...)>
struct wrapper
Run Code Online (Sandbox Code Playgroud)
上面的内容不会编译,因为variadic参数必须是最后一个.所以我使用两个级别的模板,外部模板捕获类型,内部模板捕获函数:
template <typename R, typename... Args>
struct func_type<R(Args...)>
{
// Inner function wrapper take the function pointer as a template argument
template <R F(Args...)>
struct func
{
static int call( lua_State *L )
{
// extract arguments from L
F(/*arguments*/);
return 1;
}
};
};
Run Code Online (Sandbox Code Playgroud)
这是有效的,除了包装像这样的函数
double sin(double d) {} …Run Code Online (Sandbox Code Playgroud) 假设我有一个functor s,它是不可复制但可移动的,我怎样才能将它存储在std :: function中?即,如何编译以下代码?(使用gcc 4.6)
#include <functional>
#include <iostream>
struct S
{
S() = default;
S(S const&) = delete;
S& operator=(S const&) = delete;
S(S&&) { }
void operator()() { }
};
std::function<void()> func;
void make_func()
{
S s;
func = std::bind(std::move(s)); // This won't compile
}
int main()
{
make_func();
}
Run Code Online (Sandbox Code Playgroud) 我正在使用epoll_wait编写一个程序来等待64位Linux上的文件描述符,并且我尝试将一些信息与文件描述符一起放在epoll_event用户数据中.
我知道实际上文件描述符不可能超过32位.只是想知道内核是否保证文件描述符具有特定的范围,或者它只是从小数量计算并且不太可能变得非常大?
我正在使用clang 3.6' - std = c ++ 1z'来尝试折叠表达式,但是我不太了解.我正在测试的功能是:
auto minus = [](auto... args) { return (args - ...); };
...
std::cout << minus(10, 3, 2) << std::endl;
Run Code Online (Sandbox Code Playgroud)
根据n4191,我期待它作为左折叠扩展
(10 - 3) - 2
Run Code Online (Sandbox Code Playgroud)
然而,给出结果5,结果是9,这似乎是正确的折叠扩展,即
10 - (3 - 2)
Run Code Online (Sandbox Code Playgroud)
我错过了什么或误解了n4191吗?谢谢
有什么方法可以检测程序是否由 systemd 作为守护进程运行?
系统API
sd_booted()
Run Code Online (Sandbox Code Playgroud)
用于检测整个系统是否由 systemd 启动,但没有提及程序本身。
谢谢
我刚刚在我的ubuntu 10.04上编译并安装了clang + llvm 3.0,以及来自svn的libc ++.由于libc ++中的状态显示线程支持已完成,我想尝试std :: async.所以我按照Anthony Williams给出的例子
只需做一些小改动就可以编译:
#include <future>
#include <iostream>
int calculate_the_answer_to_LtUaE()
{
return 42;
}
void do_stuff()
{
std::cout << "doing stuff" << std::endl;
}
int main()
{
std::future<int> the_answer=std::async(calculate_the_answer_to_LtUaE);
do_stuff();
std::cout<<"The answer to life, the universe and everything is "
<<the_answer.get()<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我编译
clang ++ --std = c ++ 0x -stdlib = libc ++ -lpthread async.cpp
但是,它运行并始终以核心转储结束:
做东西生命的答案,宇宙和一切都被中止(核心倾倒)
我检查核心转储,它显示这样的堆栈(我没有得到一个提示)
#0 0x00007fd0a1a7ba75 in raise () from /lib/libc.so.6 #1 0x00007fd0a1a7f5c0 in abort () from …