Tag: c ++ 11

如何添加“-std = c + + 11”到由qmake生成的生成文件?

我正在开发一个Qt程序。 它的makefile是从.pro文件自动生成的。 我需要使用一些需要为g ++设置-std = c ++ 11标志的代码。 .pro应该在哪里添加这个标志? (只改变Makefile将不会工作,因为它被新生成的,每次我build立项目覆盖)。

在C ++ 11和Boost.Container下,vector :: resize(size_type n)的行为是否正确?

我有一个C ++ 03应用程序,其中std::vector<T>types被用作临时缓冲区。 因此,它们通常使用std::vector<T>::resize()来std::vector<T>::resize()以确保它们足够大,以便在使用前保存所需的数据。 这个函数的C ++ 03原型实际上是: void resize(size_type n, value_type val = value_type()); 所以实际上在调用resize() ,通过添加val的相应数量的副本来扩大向量。 但是,我经常需要知道vector足够大以容纳我需要的数据; 我不需要用任何值初始化它。 复制构build新值只是浪费时间。 C ++ 11来拯救(我认为):在其规范中,它将resize()分成两个重载: void resize(size_type n); // value initialization void resize(size_type n, const value_type &val); // initialization via copy 这很适合C ++的哲学:只为你想要的付出代价。 但是,正如我所指出的那样,我的应用程序不能使用C ++ 11,所以当我遇到Boost.Container库的时候,我很高兴,它在文档中指出了对这个function的支持 。 具体来说, boost::container::vector<T>实际上有三个resize()重载: void resize(size_type n); // value initialization void resize(size_type n, […]

什么构成C ++ 11中的“从…移到”对象的有效状态?

我一直在试图围绕C ++ 11中的移动语义如何工作,而且我在理解移动对象需要满足的条件方面遇到了很多麻烦。 看看这里的答案并不能真正解决我的问题,因为看不到我们的问题,因为我们无法看出如何以合理的方式将它应用于pimpl对象,尽pipe移动语义对于pimpls来说是完美的 。 我的问题的最简单的例子涉及到pimpl的成语,就像这样: class Foo { std::unique_ptr<FooImpl> impl_; public: // Inlining FooImpl's constructors for brevity's sake; otherwise it // defeats the point. Foo() : impl_(new FooImpl()) {} Foo(const Foo & rhs) : impl_(new FooImpl(*rhs.impl_)) {} Foo(Foo && rhs) : impl_(std::move(rhs.impl_)) {} Foo & operator=(Foo rhs) { std::swap(impl_, rhs.impl_); return *this; } void […]

单字符意味着什么?

从这里的答案。 class wrap { public: operator obj() const & { … } //Copy from me. operator obj() && { … } //Move from me. private: obj data_; }; 我知道&&表示当对象是右值引用时,成员将被调用。 但是,单个&符号是什么意思? 和没有&符号有什么不同?

为什么对于不是TriviallyCopyable的对象,std :: memcpy的行为是未定义的?

从http://en.cppreference.com/w/cpp/string/byte/memcpy : 如果对象不是TriviallyCopyable (例如标量,数组,C兼容结构),则行为是未定义的。 在我的工作中,我们已经使用std::memcpy很长时间来按位交换不是TriviallyCopyable的对象: void swapMemory(Entity* ePtr1, Entity* ePtr2) { static const int size = sizeof(Entity); char swapBuffer[size]; memcpy(swapBuffer, ePtr1, size); memcpy(ePtr1, ePtr2, size); memcpy(ePtr2, swapBuffer, size); } 从来没有任何问题。 我明白,滥用std::memcpy与非TriviallyCopyable对象并导致下游未定义的行为是微不足道的。 不过,我的问题是: 为什么在使用非TriviallyCopyable对象时, std::memcpy本身的行为是未定义的? 为什么标准认为有必要指定? UPDATE http://en.cppreference.com/w/cpp/string/byte/memcpy的内容已经被修改,以回应这个post和post的答案。 目前的描述说: 如果对象不是TriviallyCopyable (例如标量,数组,C兼容结构),则行为是不确定的,除非程序不依赖于目标对象(不由memcpy运行)的析构函数的效果以及目标对象(已结束,但未由memcpy启动)通过其他方式启动,如placement-new。 PS 评论者@Cubbi: @RSahu如果有东西保证UB下游,它呈现整个程序未定义。 但我同意,在这种情况下,似乎有可能绕过UB,并相应地修改相关的参考。

“downcasting”unique_ptr <Base>到unique_ptr <Derived>

我有一系列返回unique_ptr<Base>的工厂。 然而,它们提供了指向各种派生types的指针,即unique_ptr<Derived> , unique_ptr<DerivedA> , unique_ptr<DerivedB>等。 鉴于DerivedA : Derived和Derived : Base我们会有: unique_ptr<Base> DerivedAFactory() { return unique_ptr<Base>(new DerivedA); } 我需要做的就是将指针从返回的unique_ptr<Base>到某个派生级别(不一定是原来的内部级别)。 为了说明伪代码: unique_ptr<Derived> ptr = static_cast<unique_ptr<Derived>>(DerivedAFactory()); 我正在考虑通过从unique_ptr释放对象,然后使用一个函数来转换原始指针并将其重新分配给另一个所需flavor的unique_ptr ( release将在调用之前由调用方明确完成): unique_ptr<Derived> CastToDerived(Base* obj) { return unique_ptr<Derived>(static_cast<Derived*>(obj)); } 这是有效的,还是会有一些质朴的事情呢? PS。 还有一个复杂的问题,一些工厂驻留在运行时dynamic加载的DLL中,这意味着我需要确保生成的对象在创build时在相同的上下文(堆空间)中被销毁。 所有权的转移(通常发生在另一个环境中)必须从原始上下文中提供一个删除者。 但是除了必须提供/删除指针以外,投射问题应该是相同的。

如何调用所有可变参数模板参数的函数?

我想做 template<typename… ArgTypes> void print(ArgTypes… Args) { print(Args)…; } 它相当于这个相当庞大的recursion链: template<typename T, typename… ArgTypes> void print(const T& t, ArgTypes… Args) { print(t); print(Args…); } 接下来是我想要打印的每种types的明确的单参数专业化。 recursion实现的“问题”是生成了大量冗余代码,因为每个recursion步骤都会产生N-1参数的新函数,而我想要的代码只会生成单个N – printfunction,最多有N专门的printfunction。

什么是“… …”令牌的含义? 即参数包中的双省略号运算符

在浏览gcc当前的新C ++ 11头文件的过程中,我偶然发现了“……”令牌。 你可以检查,下面的代码编译罚款 [通过ideone.com]。 template <typename T> struct X { /* … */ }; template <typename T, typename … U> struct X<T(U……)> // this line is the important one { /* … */ }; 那么,这个令牌的含义是什么? 编辑:看起来像修剪“……”问题标题为“…”,我确实是指“……”。 🙂

为什么`std :: move`命名为`std :: move`?

C ++ 11 std::move(x)函数根本就不移动任何东西。 这只是一个演员r值。 为什么这样做? 这不是误导?

在C ++中包含头文件时,尖括号<>和双引号“”之间的区别?

可能重复: #include <filename>和#include“filename”有什么区别? 在C ++中包含头文件时,尖括号< >和双引号" "什么区别? 我的意思是应该包含哪些文件,例如: #include <QPushButton>以及哪些文件将被包括在内,例如: #include "MyFile.h" ???