Tag: c ++ 11

为什么C ++模板使用尖括号语法?

标题问题是指在1990年左右引入模板的C ++标准中的devise决策。 为什么devise师使用<> (尖括号)而不是() ( () (圆括号)? 这样做会节省大量程序员的位移有关的错误 std::vector<std::vector<int>> // does not work until C++11 这只在C ++ 11中得到了修复。 我没有看到引入额外语法的理由,可以说,圆括号可以达到同样的目的,同时保持更改极简。 绝对可以使用 template(typename T) // Define template if round brackets could be used mytemplate { … } … … mytemplate(mytemplate(int)) obj; //Instantiate template when round brackets could be used 熟悉C ++历史的人能否挖掘使用尖括号的原始devise原理? 或者,你可以说明为什么其他解决scheme不会有效?

为什么std :: shuffle方法在C ++ 14中被弃用?

根据std :: shufle上的cppreference.com参考站点,以下方法在c ++ 14中被弃用: template< class RandomIt > void random_shuffle( RandomIt first, RandomIt last ); 为什么我们不能不通过第三个参数来调用下面的函数呢? std::random_shuffle(v.begin(),v.end()); //no longer valid in c++14 它看起来不像一个不同的function减速有一个默认的参数设置。 这背后的原因是什么? 有没有添加一些替代品?

为什么C ++ 11从std :: vector的fill构造函数的原型中删除默认值?

在C ++ 98中, std::vector的fill构造函数的原型具有初始值设定项的默认值。 explicit vector (size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type()); C ++ 11使用两个原型。 explicit vector (size_type n); vector (size_type n, const value_type& val, const allocator_type& alloc = allocator_type()); (在C ++ 14中,填充构造函数再次发生了变化,但这不是这个问题的要点。) 参考链接在这里 。 为什么C ++ 11不推荐使用默认的初始值设定项value_type() ? 顺便说一句,我试着用clang++ -std=c++11来编译下面的代码,它发出了一个错误,这意味着值types仍然需要像S() {}这样的默认构造函数,也就是默认构造。 #include <vector> struct S { int k; […]

C2977:“std :: tuple”:太多的模板参数(MSVC11)

我试图用Visual C ++ 11build立googletest,但下面的代码会导致错误 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t, // <– error C2977 ::std::ostream* os) { PrintTupleTo(t, os); } 这是一个错误文字: f:\gtest-1.6.0\include\gtest\gtest-printers.h(550): error C2977: 'std::tuple' : too many template arguments […]

你最喜欢的C ++ 0xfunction是什么?

正如我们中许多人所知道的(还有许多人不知道),C ++目前正在接受国际标准下一版修订的最终草案,预计将在近两年内出版。 草稿和文件目前可从委员会网站上获得 。 各种各样的新function正在被添加,最大的概念和lambda。 有一个非常全面的维基百科文章与许多新function。 GCC 4.3及更高版本实现了一些C ++ 0xfunction 。 至于新function,我真的很喜欢types特征(和适当的概念),但我确定的领导是可变模板。 在0x之前,长的模板列表通常涉及到Boost预处理器,而且写起来非常不愉快。 这使得事情变得更容易,并且允许C ++ 0x模板被视为使用可变参数模板的完美function语言。 我已经写了一些非常酷的代码,我已经等不及更频繁地使用它们了! 那么你最期待的function是什么?

在static_assert输出中整合types名称?

我喜欢提供有用的错误/消息,我也想为我的static_assert这样做。 问题是,他们依赖于模板参数。 通常情况下,这些参数会因为出错而显示在屏幕上或者其他屏幕上,但是这些参数要么是模糊的,要么是没有分组,所以它们是有意义的。 例: template<class T> struct fake_dependency{ static bool const value = false; }; template<class T, class Tag> struct Foo{ Foo(){} template<class OtherTag> Foo(Foo<T, OtherTag> const&){ static_assert(fake_dependency<T>::value, "Cannot create Foo<T,Tag> from Foo<T,OtherTag>."); } }; int main(){ Foo<int, struct TagA> fA; Foo<int, struct TagB> fB(fA); } MSVC输出: src\main.cpp(74): error C2338: Cannot create Foo<T,Tag> from Foo<T,OtherTag>. […]

对于一个lambda来说,是否有效,本质上是closures它自己?

这个lambdarecursion是有效的吗? #include <functional> #include <iostream> int main() { std::function<int(int)> g = [&g](int k) { return (k ? k * g(k-1) : 1); }; std::cout << g(10); // 3628800 } 它似乎编译和运行正常 ,但我很担心在我初始化相同的声明closuresg 。 1-10级的严格有效性?

随机引擎的差异

C ++ 11标准为随机数生成指定了许多不同的引擎: linear_congruential_engine , mersenne_twister_engine , subtract_with_carry_engine等等。 显然,这是std::rand的旧用法的一个很大的改变。 显然,这些引擎(至less有一些)的主要好处之一就是大大增加了周期长度(它被构build在std::mt19937的名字std::mt19937 )。 但是,引擎之间的差异不太清楚。 不同引擎的优缺点是什么? 什么时候应该使用另一个? 是否有一个明智的默认应该通常是首选?

std :: string总是以C ++ 11为空终止?

Herb Sutter在他的网站2008年的一篇文章中指出: 有一个积极的build议,在C ++ 0x中进一步收紧,并要求空终止,并可能禁止写入时复制的实现,为并发相关的原因。 以下是论文: http : //www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2534.html 。 我认为本文中的一个或两个提案很可能会被采纳,但是我们将在下一次或两次会议上看到。 我知道C ++ 11现在可以保证std :: string的内容是连续存储的,但是他们是否在最后的草稿中采用了上面的内容? 现在是否可以安全地使用像&str[0]这样的东西?

如何使用<system_error>将errno转换为exception

我阅读了一系列关于C ++ 11中新的<system_error>头文件的深思熟虑的博客文章 。 它说,头文件定义了一个error_code类,它表示一个操作(如系统调用)返回的特定错误值。 它说,头文件定义了一个system_error类,它是一个exception类(inheritance自runtime_exception ),用于包装error_codes 。 我想知道的是如何实际上从errno转换系统错误到system_error所以我可以把它扔掉。 例如,POSIX open函数通过返回-1和设置errno报告错误,所以如果我想抛出exception,我应该如何完成下面的代码? void x() { fd = open("foo", O_RDWR); if (fd == -1) { throw /* need some code here to make a std::system_error from errno */; } } 我随机尝试: errno = ENOENT; throw std::system_error(); 但是当调用what()时,得到的exception不会返回任何信息。 我知道我可以throw errno; 但我想用正确的方式使用新的<system_error>标题。 有一个system_error的构造函数, system_error接受一个error_code作为参数,所以如果我可以将errno转换成error_code那么其余部分应该是显而易见的。 这似乎是一个非常基本的东西,所以我不知道为什么我找不到一个很好的教程。 如果有问题,我在ARM处理器上使用gcc 4.4.5。