Tag: c ++ 11

实时环境中的exception仍然不受欢迎?

几年前,我被告知,在embedded式系统或(非Linux)内核开发C ++ – 例外 的实时应用程序是不受欢迎的。 (也许这个教训是从gcc-2.95之前的)。 但是我也知道,exception处理已经变得更好了。 那么,在实际应用环境中, C ++就是例外情况 完全不需要的? 甚至通过编译器开关closures? 或非常仔细可用? 或者现在处理得如此之好,以至于几乎可以自由使用它们,还有一些事情要考虑? C ++ 11是否改变了这一点? 更新 :exception处理是否真的需要启用RTTI (就像一个回答者build议的那样)? 是否有dynamic演员参与,或类似?

为什么我应该更喜欢“明确types的初始值设定项”成语,而不是明确给出types

我最近从Scott Meyers购买了新的有效的现代C ++,现在阅读。 但是我遇到一件事情,那就是完全的错误。 斯科特在第5项中说,使用auto是一件好事。 它可以节省打字的时间,在大多数情况下可以提供正确的打字types,并且可以避免types不匹配。 我完全理解这一点,并认为auto也是一件好事。 但是,斯科特在第6项中说,每一枚硬币都有两面。 同样,在auto推断完全错误的types(例如代理对象)时,可能会出现这种情况。 你可能已经知道这个例子: class Widget; std::vector<bool> features(Widget w); Widget w; bool priority = features(w)[5]; // this is fine auto priority = features(w)[5]; // this result in priority being a proxy // to a temporary object, which will result // in undefined behavior on usage after that // line […]

为什么C ++ 11有`make_shared`而不是`make_unique`

可能重复: make_unique和完美的转发 为什么C ++ 11有一个make_shared模板,但不是make_unique模板? 这使得代码非常不一致。 auto x = make_shared<string>("abc"); auto y = unique_ptr<string>(new string("abc"));

什么是低于正常的浮点数?

isnormal()参考页面告诉: 确定给定的浮点数arg是否正常,即不是零,低于正常,无限,也不是NaN。 一个数字是零,无限或NaN清楚是什么意思。 但是它也说低于正常水平。 什么时候是一个数字低于正常?

是std :: vector <T>一个`用户定义的types`?

在当前标准草案的 17.6.4.2.1 / 1和17.6.4.2.1 / 2中,对用户注入namespace std专门化进行了限制。 除非另有说明,否则C ++程序的行为是未定义的,如果它将声明或定义添加到名称空间std或名称空间std中的名称空间。 只有当声明依赖于用户定义的types ,并且专业化符合原始模板的标准库要求并且没有明确禁止时,程序可以将任何标准库模板的模板专用化添加到名称空间std。 我无法find标准中用户定义types定义的词组。 我听说一个选项声称是一个不是std::is_fundamental types是一个用户定义的types ,在这种情况下, std::vector<int>将是一个用户定义的types 。 另一个答案是用户定义的types是用户定义的types 。 由于用户没有定义std::vector<int> ,而std::vector<int>不依赖于用户定义的任何types,所以std::vector<int>不是用户定义的types 。 这个影响的一个实际问题是“你可以为std::tuple<Ts…>注入一个std::hash的专门化到namespace std吗?能够这样做有点方便 – 另一种方法是创build另一个名称空间我们recursion地构build我们的std::tuple (也可能是std中没有hash支持的其他types)的hash ,当且仅当我们无法在那个名字空间中find散列时,我们才回退std 。 但是,如果这是合法的,那么如果标准为std::tuple添加了一个hash专门化到namespace std ,已经被专门化的代码将被破坏,创build一个不会在未来添加这样的专业化的理由。 虽然我正在谈论作为一个具体的例子std::vector<int> ,我想问是否std中定义的types是用户定义的types s。 第二个问题是,即使没有,也许std::tuple<int>在用户使用时变成了一个用户定义的types (这会变得很滑:如果std内的东西定义了std::tuple<int> ,那么会发生什么呢?你对std::tuple<Ts…>进行部分hash )。 目前在这个问题上有一个公开的缺陷 。

为什么这个包含rand()的C ++ 11代码比使用multithreading更慢?

我正在尝试新的C ++ 11线程,但是我的简单testing具有糟糕的多核性能。 作为一个简单的例子,这个程序加起来一些平方随机数。 #include <iostream> #include <thread> #include <vector> #include <cstdlib> #include <chrono> #include <cmath> double add_single(int N) { double sum=0; for (int i = 0; i < N; ++i){ sum+= sqrt(1.0*rand()/RAND_MAX); } return sum/N; } void add_multi(int N, double& result) { double sum=0; for (int i = 0; i < N; ++i){ sum+= […]

为什么这个简单的std :: thread示例不起作用?

试了用g++ -std=gnu++0x t1.cpp和g++ -std=c++0x t1.cpp编译的下面的例子,但是这两个都导致例子中止。 $ ./a.out terminate called after throwing an instance of 'std::system_error' what(): Aborted 这是样本: #include <thread> #include <iostream> void doSomeWork( void ) { std::cout << "hello from thread…" << std::endl; return; } int main( int argc, char *argv[] ) { std::thread t( doSomeWork ); t.join(); return 0; } 我试图在Ubuntu 11.04上: $ […]

条件variables,互斥锁和锁之间的区别

例如c ++ 0x接口 我很难搞清楚什么时候使用这些东西(cv,mutex和lock)。 任何人都可以请解释或指向一个资源? 提前致谢。

C + + 11:更正std ::数组初始化?

如果我初始化一个std ::数组如下,编译器给我一个关于缺less大括号的警告 std::array<int, 4> a = {1, 2, 3, 4}; 这解决了这个问题: std::array<int, 4> a = {{1, 2, 3, 4}}; 这是警告信息: missing braces around initializer for 'std::array<int, 4u>::value_type [4] {aka int [4]}' [-Wmissing-braces] 这只是我的gcc版本中的一个错误,还是故意完成的? 如果是这样,为什么?

C ++ 11清除shared_ptr时,我应该使用重置或设置为nullptr?

我有一个关于C ++ 11最佳实践的问题。 清除shared_ptr时,应该使用不带参数的reset()函数,还是应该将shared_ptr设置为nullptr ? 例如: std::shared_ptr<std::string> foo(new std::string("foo")); foo.reset(); foo = nullptr; 有没有真正的区别,还是有两个方法的优点/缺点?