Tag: c ++ 11

我如何使用一个std :: unique_ptr成员的定制删除器?

我有一个unique_ptr成员的类。 class Foo { private: std::unique_ptr<Bar> bar; … }; Bar是一个具有create()函数和destroy()函数的第三方类。 如果我想在独立函数中使用std::unique_ptr ,我可以这样做: void foo() { std::unique_ptr<Bar, void(*)(Bar*)> bar(create(), [](Bar* b){ destroy(b); }); … } 有没有办法做到这一点与std::unique_ptr作为一个类的成员?

为什么我们复制然后移动?

我看到代码在某个地方有人决定复制一个对象,然后把它移动到一个类的数据成员。 这使我感到困惑,因为我认为整个移动的目的是避免复制。 这是一个例子: struct S { S(std::string str) : data(std::move(str)) {} }; 这是我的问题: 为什么我们不采取右值参考str ? 不会有一个副本是昂贵的,尤其是给一些像std::string ? 那么作者决定做一个副本然后呢是什么呢? 我应该什么时候自己做这个?

如何存储可变参数模板?

是否有可能以某种方式存储参数包供以后使用? template <typename… T> class Action { private: std::function<void(T…)> f; T… args; // <— something like this public: Action(std::function<void(T…)> f, T… args) : f(f), args(args) {} void act(){ f(args); // <— such that this will be possible } } 接下来: void main(){ Action<int,int> add([](int x, int y){std::cout << (x+y);}, 3, 4); //… add.act(); }

用户定义的文字添加到C ++中的新function是什么?

C ++ 11引入了用户定义的文字 ,它将允许基于现有文字( int , hex , string , float )引入新的文字语法,以便任何types都能够具有文字表示。 例子: // imaginary numbers std::complex<long double> operator "" _i(long double d) // cooked form { return std::complex<long double>(0, d); } auto val = 3.14_i; // val = complex<long double>(0, 3.14) // binary values int operator "" _B(const char*); // raw form int answer […]

当操作符&重载时,如何可靠地获取对象的地址?

考虑下面的程序: struct ghost { // ghosts like to pretend that they don't exist ghost* operator&() const volatile { return 0; } }; int main() { ghost clyde; ghost* clydes_address = &clyde; // darn; that's not clyde's address :'( } 我如何得到clyde的地址? 我正在寻找一种解决scheme,将同样适用于所有types的对象。 一个C ++ 03解决scheme会很好,但我也对C ++ 11解决scheme感兴趣。 如果可能的话,让我们避免任何特定于实现的行为。 我知道C ++ 11的std::addressof函数模板,但我不想在这里使用它:我想了解一个标准库实现者可能如何实现这个函数模板。

std :: auto_ptr到std :: unique_ptr

随着新的标准的到来(和一些编译器已经可用的部分),新的std::unique_ptrtypes应该是std::auto_ptr的替代品。 他们的使用是否完全重叠(所以我可以在我的代码上进行全局查找/replace(不是我会这样做,但是如果我这样做)),还是应该知道读取文档中不明显的一些差异? 另外,如果它是一个直接replace(为什么给它一个新的名字),而不是改善std::auto_ptr 。

操作数的评估顺序

在expression式a + b ,保证在b之前被评估,还是未指定评估的顺序? 我认为这是后者,但我很难在标准中find明确的答案。 由于我不知道C是否处理了与C ++不同的问题,或者如果在C ++ 11中简化了评估顺序规则,我将把问题标记为三个。

检查可变参数的唯一性参数

我想variadic模板参数必须唯一。 我知道当多inheritance时,不允许相同的类inheritance。 struct A{}; struct B: A, A{}; // error 使用这个规则,我做了一个小小的代码。 #include <type_traits> template< class T> struct id{}; template< class …T> struct base_all : id<T> … {}; template< class … T> struct is_unique { template< class … U> static constexpr bool test( base_all<U…> * ) noexcept { return true; } template< class … U> static […]

constexpr和初始化一个静态const void指针reinterpret强制转换,哪个编译器是正确的?

考虑下面的一段代码: struct foo { static constexpr const void* ptr = reinterpret_cast<const void*>(0x1); }; auto main() -> int { return 0; } 上面的例子在g ++ v4.9( Live Demo )中编译得很好,但是在v3.4( Live Demo )中编译失败,并且产生下面的错误: 错误:constexprvariables'ptr'必须由一个常量expression式初始化 问题: 两个编译器哪一个按照标准是正确的? 宣称这种expression方式的正确方法是什么?

😃(和其他unicode字符)不能被g ++识别的标识符

我发现,即使启用了-fextended-identifiers选项,我也不能使用😃作为g ++ 4.7的有效标识符: int main(int argc, const char* argv[]) { const char* 😃 = "I'm very happy"; return 0; } main.cpp:3:3:错误:在程序中丢失'\ 360' main.cpp:3:3:错误:在程序中丢失'\ 237' main.cpp:3:3:错误:在程序中丢失'\ 230' main.cpp:3:3:错误:在程序中丢失'\ 203' 经过一些Googlesearch之后,我发现UTF-8字符在标识符中还不被支持,但通用字符名称应该可以工作。 所以我把我的源代码转换为: int main(int argc, const char* argv[]) { const char* \U0001F603 = "I'm very happy"; return 0; } main.cpp:3:15:错误:通用字符\ U0001F603在标识符中无效 所以显然😃不是一个有效的标识字符。 但是,该标准特别允许附件E.1中的范围为10000-1FFFD字符,并且不允许它作为E.2中的初始字符。 我的下一个努力是看看是否有其他允许的unicode字符的工作 – 但我没有试过。 公安条例(💩)的性质甚至不重要。 […]