Tag: c ++ 11

箭头运算符( – >)在函数标题中

我发现这样的代码: template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) { return a+b; } 我想到了所有的细节,这些细节对我来说是新的,但是其中之一。 请告诉我,我在哪里可以阅读,在function标题中箭头运算符( -> )是什么意思? 我想纯粹逻辑上,那->运算符决定一个types,这将通过auto得到,但我想得到这个直,但不能find信息。

std :: unique_ptr的用法

std::unique_ptr<int> p1(new int); std::unique_ptr<int> p2(new int); p2=p1; 在这里似乎p1不再是“唯一的”,因为p2也是指它 这是合法的C ++? unique_ptr是否有copy_semantics? 如果不是,并且只有移动语义,则在将其分配给p2后将p1设置为NULL? 编辑: 好的,所以正确的版本是 p2=std::move(p1) 据此,在这个分配之后,p1是无效的? 和auto_ptr的区别在这里? 我认为明确地明确所有权的转移是比auto_ptr更为安全

C ++ std :: unordered_map中使用的默认哈希函数是什么?

我在用 unordered_map<string, int> 和 unordered_map<int, int> 每种情况下使用什么散列函数,每种情况下碰撞的机会是多less? 我将分别插入唯一的string和唯一的int作为键。 我有兴趣知道散列函数在string和整型键以及它们的碰撞统计量的情况下的algorithm。

为什么你不能把nullptr的地址?

在C ++ 11标准中,我不明白为什么接受nullptr的地址是不允许的,而允许一个接受他们自己的std :: nullptr_t实例的地址。 除了nullptr是一个保留关键字的事实之外,这个决定是否有任何指定的推理呢? 简单地说,因为这让我感到好笑,所以我试图用下面的函数来绕开这个限制: decltype(nullptr)* func(const decltype(nullptr) &nref) noexcept { return const_cast<decltype(nullptr)*>(reinterpret_cast<const decltype(nullptr)*>(&nref)); } 我不得不在参数上使用reinterpret_cast,因为没有它我得到了歇斯底里的错误: error: invalid conversion from 'std::nullptr_t*' to 'std::nullptr_t*' [-fpermissive] 当我通过直接传递nullptr来调用这个函数时,我每次都得到一个不同的地址。 是nullptrdynamic地分配一个地址及时进行比较等? 或者(可能更可能)也许是编译器强制底层对象的临时副本? 当然这些都不是重要的信息,我只是觉得有趣的是为什么这个特定的限制被实现(以及为什么我看到了我的行为)。

为什么别名模板给出了相冲突的声明?

从Clang到g ++的一些C ++ 11代码的端口 template<class T> using value_t = typename T::value_type; template<class> struct S { using value_type = int; static value_type const C = 0; }; template<class T> value_t<S<T>> // gcc error, typename S<T>::value_type does work const S<T>::C; int main() { static_assert(S<int>::C == 0, ""); } 为Clang(版本3.1至SVN中继)与任何g ++版本提供不同的行为。 对于后者,我得到这样的错误 prog.cc:13:13: error: conflicting declaration 'value_t<S<T> > […]

应该std :: bind与boost :: asio兼容吗?

我正在尝试使用boost :: asio示例之一来尽可能地使用c ++ 11 / TR1库。 原始代码如下所示: void start_accept() { tcp_connection::pointer new_connection = tcp_connection::create(acceptor_.get_io_service()); acceptor_.async_accept(new_connection->socket(), boost::bind(&tcp_server::handle_accept, this, new_connection, boost::asio::placeholders::error)); } 如果我用std::bindreplaceboost::bind ,如下所示: void start_accept() { tcp_connection::pointer new_connection = tcp_connection::create(acceptor_.get_io_service()); acceptor_.async_accept(new_connection->socket(), std::bind(&tcp_server::handle_accept, this, new_connection, boost::asio::placeholders::error ) ); // std::bind(&tcp_server::handle_accept, this, new_connection, _1 ) ); } 我收到一个很大的错误信息,结尾是: /usr/include/c++/4.4/tr1_impl/functional:1137: error: return-statement with a value, in function returning […]

在C ++ 1y模式中,Clang> = 3.3不能parsing<cstdio>头文件

我有一个项目,正确地编译和运行在g ++ 4.8.1和铿锵> = 3.3在c + + 11模式。 但是,当我切换到实验-std=c++1y模式时,在通过Boost.Test间接包含的<cstdio>头文件中的clang 3.3(但不是g ++)扼stream圈(所以我不能轻易地自己改变它) // /usr/include/c++/4.8/cstdio #include <stdio.h> // Get rid of those macros defined in <stdio.h> in lieu of real functions. // … #undef gets // … namespace std { // … using ::gets; // <– error with clang++ -std=c++1y // … } 与以下错误消息: /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/cstdio:119:11:错误:在全局中没有名为“gets”的成员命名空间 在本教程中 ,如何设置一个现代的C […]

如何实际执行五项规则?

在底部更新 问题1:如何执行五级规则来pipe理相当重的资源,但希望通过价值来传递这些资源,因为这极大地简化和美化了它的用法。 还是不是规则的所有五项甚至需要? 在实践中,我正在开始3D成像,其中图像通常是128 * 128 * 128加倍。 能够写这样的东西会使math更容易: Data a = MakeData(); Data c = 5 * a + ( 1 + MakeMoreData() ) / 3; q2:使用复制elision / RVO /移动语义的组合,编译器应该能够以最less的复制这个,不是? 我试图找出如何做到这一点,所以我开始了基础知识; 假设一个实现复制和分配的传统方式的对象: class AnObject { public: AnObject( size_t n = 0 ) : n( n ), a( new int[ n ] ) {} AnObject( […]

在C ++ 11中省略返回types

我最近发现自己在C ++ 11模式下使用gcc 4.5使用下面的macros: #define RETURN(x) -> decltype(x) { return x; } 并写这样的function: template <class T> auto f(T&& x) RETURN (( g(h(std::forward<T>(x))) )) 我一直在这样做,以避免不必要有效地写两次函数体,并保持身体和返回types的同步(这在我看来是一个等待发生的灾难)的变化。 问题是,这种技术只适用于一行function。 所以当我有这样的事情(令人费解的例子): template <class T> auto f(T&& x) -> … { auto y1 = f(x); auto y2 = h(y1, g1(x)); auto y3 = h(y1, g2(x)); if (y1) { ++y3; } return […]

我如何获得一个const_iterator使用自动?

第一个问题:是否有可能“强制”一个const_iterator使用自动? 例如: map<int> usa; //…init usa auto city_it = usa.find("New York"); 我只是想查询,而不是改变city_it指出的任何东西,所以我想有city_it是map<int>::const_iterator 。 但是通过使用auto, city_it和map::find()的返回types是一样的,它是map<int>::iterator 。 任何build议?