Tag: c ++ 11

像int(x)这样的声明的目的是什么? 或者int(x)= 10;

如果你*declarator*s in §8/4查看*declarator*s in §8/4语法,你会发现noptr-declarator可以写成( ptr-declarator ),也就是说,它可以写成( declarator-id ),validation标题中的声明。 事实上,这个代码编译没有问题: #include <iostream> struct A{ int i;}; int (x) = 100; A (a) = {2}; int main() { std::cout << x << '\n'; std::cout << ai << '\n'; } 但是,当指针(到数组或函数)不在声明中时,允许这些括号的目的是什么 ?

在C ++ 11中,“不代表执行线程”的线程有什么意义?

在C ++ 11中查看新线程的东西,看看它是如何轻松映射到pthread,我注意到thread构造函数区域中的好奇的部分: 线(); 效果:构造一个不代表执行线程的线程对象。 后置条件: get_id()== id() 抛出:没有。 换句话说,一个线程的默认构造函数实际上并不会创build一个线程。 很显然,它创build了一个线程对象,但是如果没有后台代码,那么它究竟有用呢? 有没有其他方式可以将“执行线程”附加到该对象,如thrd.start()或类似的东西?

C ++终止调用没有一个活动的exception

我得到一个C ++线程错误: terminate called without an active exception Aborted 这里是代码: #include <queue> #include <thread> #include <mutex> #include <condition_variable> template<typename TYPE> class blocking_stream { public: blocking_stream(size_t max_buffer_size_) : max_buffer_size(max_buffer_size_) { } //PUSH data into the buffer blocking_stream &operator<<(TYPE &other) { std::unique_lock<std::mutex> mtx_lock(mtx); while(buffer.size()>=max_buffer_size) stop_if_full.wait(mtx_lock); buffer.push(std::move(other)); mtx_lock.unlock(); stop_if_empty.notify_one(); return *this; } //POP data out of the buffer […]

为什么我需要std :: condition_variable?

我发现std::condition_variable由于虚假唤醒而非常难以使用。 所以有时我需要设置一个标志,如: atomic<bool> is_ready; 我在调用notify( notify_one()或notify_all() )之前将is_ready设置为true ,然后等待: some_condition_variable.wait(some_unique_lock, [&is_ready]{ return bool(is_ready); }); 有什么理由不应该这样做:(编辑:好吧,这真是一个坏主意。) while(!is_ready) { this_thread::wait_for(some_duration); //Edit: changed from this_thread::yield(); } 如果condition_variableselect了等待时间(我不知道这是否是真的),我宁愿自己select它。

用Clang 3.4和C ++ 11的Travis CI

是否有可能得到特拉维斯CI与铿锵能够C + + 11的工作? (我想要Clang,而不是GCC,我已经在Travis CI中使用了GCC 4.8)。看来预装的版本不是C ++ 11的能力。 我所有的安装任何新版本的尝试都因为这个而失败 : In file included from /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/move.h:57: /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/type_traits:269:39: error: use of undeclared identifier '__float128' struct __is_floating_point_helper<__float128> 我已经看到了-D__STRICT_ANSI__窍门,但是和其他的东西冲突。 是否有可能得到它的工作? 另见我的.travis.yml 。

GNU C ++如何检查-std = c ++ 0x是否有效?

我的系统编译器(gcc42)与我想要的TR1function正常工作,但试图支持比系统更新的编译器版本,尝试访问TR1头文件#error要求-std = c ++ 0x选项,因为它是如何与图书馆或一些集线器像这样的接口。 /usr/local/lib/gcc45/include/c++/bits/c++0x_warning.h:31:2: error: #error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options. 提供一个额外的开关是没有问题的,在这个系统(FreeBSD)下支持GCC 4.4和4.5,但显然它改变了图片! 使用我的系统编译器(g ++ 4.2默认方言): #include <tr1/foo> using std::tr1::foo; 使用较新的(4.5)版本的编译器与-std = c ++ 0x: #include <foo> using […]

C ++ 11primefaces内存sorting – 这是放松(释放 – 消耗)sorting的正确用法吗?

我最近使用三重缓冲区的std :: atomic将C ++ 11作为端口,用作并发同步机制。 这个线程同步方法背后的想法是,对于生产者 – 消费者的情况,你有一个运行速度更快的生产者,消费者,三重缓冲可以给一些好处,因为生产者线程不会因为等待而“放慢”为消费者。 在我的情况下,我有一个更新为〜120fps的物理线程和一个以〜60fps运行的渲染线程。 很明显,我希望渲染线程总是获得最近的状态,但是我也知道,由于速率的不同,我将跳过物理线程中的很多帧。 另一方面,我希望我的物理线程保持其不变的更新速度,而不会被较慢的呈现线程locking我的数据所限制。 原来的C代码是由remis-thoughts制作的,完整的解释在他的博客里 。 我鼓励任何有兴趣阅读的人进一步了解原始实施。 我的实现可以在这里find。 基本思想是在任何给定的时间,有一个有3个位置(缓冲区)和一个primefaces标志的数组,它们被比较和交换来定义哪个数组元素对应于什么状态。 这样,只有一个primefacesvariables用于模型数组的所有3个索引和三重缓冲背后的逻辑。 缓冲区的3个位置被命名为Dirty,Clean和Snap。 生产者总是写入脏指数,并且可以翻转书写器以将脏指数与当前的干净指数交换。 使用者可以请求一个新的Snap,它使用Clean索引交换当前的Snap索引以获得最新的缓冲区。 消费者总是在Snap位置读取缓冲区。 该标志由一个8位无符号整数组成,这些位对应于: (未使用)(新写入)(2个脏)(2个清理)(2个捕捉) 新的写额外位标志由写入器设置并由读取器清除。 读者可以使用它来检查自上次捕捉以来是否有任何写入,如果没有,则不会再捕捉。 标志和索引可以使用简单的按位操作来获得。 好的,现在的代码: template <typename T> class TripleBuffer { public: TripleBuffer<T>(); TripleBuffer<T>(const T& init); // non-copyable behavior TripleBuffer<T>(const TripleBuffer<T>&) = delete; TripleBuffer<T>& operator=(const TripleBuffer<T>&) = delete; T snap() const; // get […]

我如何给stream更好的exception消息?

问题 到目前为止,对stream的exception支持是可怕的。 当Boost.System库被采用到C ++ 11中时,人们给人的印象是exception会改善。 所有的更改都是用std::system_errorreplacestd::exception 。 虽然<system_error>对开发人员来说是一个很好的库,但是标准委员会和标准库实现者并没有采取任何措施来改进exception消息。 想知道它有多糟糕,下面简要总结一下: 发生错误。 setstate用于设置badbit或failbit 。 clear由setstate 。 如果启用了exception, clear将会抛出一个ios_base::failure 。 是的,这意味着所有的错误都抛出了相同的无用的exception消息。 这是在basic_ios级别指定的,所以所有的派生类都会遇到这个问题。 违规报价: (iostate.flags)/ 4 效果 :如果((state | (rdbuf() ? goodbit : badbit)) & exceptions()) == 0 ,则返回。 否则,该函数会抛出类basic_ios::failure (27.5.3.1.1)的对象fail ,该对象由实现定义的参数值构造。 以下是“实现定义的参数值”给我们的例子: ios_base::clear: unspecified iostream_category error 有一个简单的修复? Boost.Filesystem和Boost.Iostreams都不能替代<iostream> 。 前者是一个可移植的处理文件系统的库(可能会出现在下一版C ++中),而后者与..Sources和Sinks有关。 该文档指出,它将exception委托给ios_base::failure 。 Boost.Filesystem提供<boost/filesystem/fstream.hpp> ,它使用path而不是const char*参数来open() 。 它显示了一个如何从标准库类inheritance的例子: […]

列表初始化期间临时对象的生存期

我一直认为,临时性的东西一直存在,直到一个完整的expression式结束。 然而这是一个std::vector和一个数组的初始化之间的一个奇怪的区别。 请考虑下面的代码: #include <iostream> #include <vector> struct ID{ static int cnt; // the number of living object of class ID at the moment of creation: int id; ID():id(++cnt){} ~ID(){ cnt–; } }; int ID::cnt=0; int main(){ int arr[]{ID().id, ID().id}; std::vector<int> vec{ID().id, ID().id}; std::cout<<" Array: "<<arr[0]<<", "<<arr[1]<<"\n"; std::cout<<" Vector: "<<vec[0]<<", "<<vec[1]<<"\n"; } 这个程序的输出是有点意外的(至less对我来说): Array: 1, […]

为什么在C ++ 11或C ++ 14中没有安装迭代器?

C ++ 98有front_inserter , back_inserter和inserter ,但是在C ++ 11或者C ++ 14中似乎没有这些版本的版本。 有没有技术原因,我们不能有front_emplacer , back_emplacer和emplacer ?