Tag: c ++ 11

C ++ 11线程安全队列

我正在使用的一个项目使用多个线程来处理文件的集合。 每个线程都可以将文件添加到要处理的文件列表中,所以我放在一起(我以为是)一个线程安全的队列。 相关部分如下: // qMutex is a std::mutex intended to guard the queue // populatedNotifier is a std::condition_variable intended to // notify waiting threads of a new item in the queue void FileQueue::enqueue(std::string&& filename) { std::lock_guard<std::mutex> lock(qMutex); q.push(std::move(filename)); // Notify anyone waiting for additional files that more have arrived populatedNotifier.notify_one(); } std::string FileQueue::dequeue(const std::chrono::milliseconds& timeout) […]

获取没有对象的成员函数的返回types

我有一些我不能修改的类。 每个都有一个拷贝构造函数,至less有一个其他的构造函数和一个返回值的函数foo() 。 我想创build一个可以从这些类派生出来的类模板,并且有一个与foo()的返回types相同types的数据成员(抱歉,如果我有一些术语错误)。 换句话说,我想要一个类模板 template<typename T> class C : public T { footype fooresult; }; footype是T::foo()的返回types。 如果基类都拥有默认的构造函数,我可以这样做 decltype(T().foo()) fooresult; (在GCC中具有C ++ 0xfunction),但除了复制构造函数之外,类没有任何特殊的构造函数。 GCC也不允许decltype(this->foo()) ,尽pipe显然有可能这将被添加到C ++ 0x标准 – 有谁知道这是多么可能吗? 我觉得应该可以沿着decltype(foo())或decltype(T::foo())的方式来做一些事情,但这些似乎不起作用:GCC给出了一个错误,表单cannot call member function 'int A::foo()' without object 。 当然,我可以有一个额外的模板参数footype ,甚至Ttypes的非类参数,但有什么办法可以避免这种情况?

C ++ 11成员初始化列表模糊

由于在这个环境中的GNU标准库实现,我正在努力解决看起来在c ++ 11符号分辨率上的模糊问题: Arch Linux 4.2.5-1(x86_64) g ++ 5.2.0 铿锵++ 3.7.0 例: #include <iostream> #include <string> struct version { unsigned major; unsigned minor; unsigned patch; version(unsigned major, unsigned minor, unsigned patch) : major(major), minor(minor), patch(patch) { } friend std::ostream & operator<<(std::ostream & out, version const& v) { out << v.major << "."; out << v.minor […]

std :: remove_if – lambda,不会从集合中删除任何东西

好的,我希望我在这里犯了一个愚蠢的错误。 我有一个DisplayDevice3d列表,每个DisplayDevice3d包含一个DisplayMode3d列表。 我想从DisplayDevice3d列表中删除没有任何DisplayMode3d的所有项目。 我正在尝试使用Lambda来做到这一点,即: // If the device doesn't have any modes, remove it. std::remove_if(MyDisplayDevices.begin(), MyDisplayDevices.end(), [](DisplayDevice3d& device) { return device.Modes.size() == 0; } ); 即使在MyDisplayDevices中的6个DisplayMode3d中,只有1个在其Modes集合中具有任何DisplayMode3d,但是没有任何内容从列表中移除。 我在这里犯了什么错误? 编辑: 嗯,我的错误是我应该使用MyDisplayDevices.remove_if而不是std :: remove_if,但是下面的答案是正确的使用std :: remove_if:p。 MyDisplayDevices.remove_if( [](DisplayDevice3d const & device) { return device.Modes.size() == 0; });

std :: unique_ptr :: get有什么意义呢?

不std::unique_ptr::get一个unique_ptr在第一个地方的目的? 我会期望这个函数改变它的状态,所以它不再有指针。 是否有一个std :: unique_ptr :: get的实际有用的使用?

为什么std :: ostream和char之间的operator <<函数是非成员函数?

当我运行下面的程序 #include <iostream> int main() { char c = 'a'; std::cout << c << std::endl; std::cout.operator<<(c) << std::endl; return 0; } 我得到了输出 a 97 进一步挖掘在http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt ,我注意到, std::ostream::operator<<()没有一个具有char作为参数types的重载。 函数调用std::cout.operator<<(a)被parsing为std::ostream::operator<<(int) ,它解释了输出。 我假设std::ostream和char之间的operator<<函数在其他地方被声明为: std::ostream& operator<<(std::ostream& out, char c); 否则, std::cout << a将parsing为std::ostream::operator<<(int) 。 我的问题是为什么声明/定义为非成员函数? 有没有已知的问题阻止它成为一个成员函数?

Java内存模型和C ++ 11内存模型有什么相似之处?

新的c ++标准引入了内存模型的概念。 关于它的问题已经有了,这是什么意思,它是如何改变我们在c ++中编写代码的方式等等。 我有兴趣了解C ++内存模型如何与旧的,众所周知的Java内存模型(1.5)相关联。 这是一样的吗? 这是类似的吗? 他们有什么重大的区别? 如果是这样,为什么? Java内存模型已经存在了很长时间,很多人都很了解它,所以我想这不仅对我来说,学习C ++内存模型是有帮助的。

如果copy-list-initialization允许显式的构造函数,会出现什么问题?

在C ++标准§13.3.1.7[over.match.list]中,陈述如下: 在复制列表初始化中,如果selectexplicit构造函数,则初始化是不合格的。 这就是我们无法做到的原因,例如: struct foo { // explicit because it can be called with one argument explicit foo(std::string s, int x = 0); private: // … }; void f(foo x); f({ "answer", 42 }); (请注意,这里发生的不是一个转换 ,即使构造函数是“隐式的”也不会是一个,这是直接使用构造函数初始化一个foo对象,除了std::string ,没有转换这里。) 这对我来说似乎很好。 没有办法,隐式转换会咬我。 如果{ "answer", 42 }可以初始化别的东西,编译器就不会背叛我,做错了事情: struct bar { // explicit because it can be called with […]

完美的转发 – 这是关于什么的?

可能重复: 使用forward的优点 有人可以向我解释什么是完美的转发?

我可以安全地使用OpenMP与C + + 11吗?

OpenMP标准只考虑C ++ 98(ISO / IEC 14882:1998)。 这意味着在C ++ 03甚至C ++ 11下没有标准的OpenMP支持。 因此,任何使用C ++> 98和OpenMP的程序都会在标准之外运行,这意味着即使它在某些条件下工作,也不太可能是便携式的,但绝对不能保证。 C ++ 11拥有自己的multithreading支持,情况更糟糕,很可能在某些实现中会与OpenMP冲突。 那么,使用C ++ 03和C ++ 11的OpenMP有多安全? 在一个相同的程序中是否可以安全地使用C ++ 11multithreading和OpenMP,但是不会交织它们(即,在任何代码中没有OpenMP语句传递给C ++ 11并发特性,线程中没有C ++ 11并发由OpenMP产生)? 我特别感兴趣的是我首先使用OpenMP调用一些代码,然后在相同的数据结构上使用C ++ 11并发的其他代码。