c++11专题提供c++11的最新资讯内容,帮你更好的了解c++11。
我最近在尝试使用完美的转发构造函数实现类层次结构时遇到了问题. 请考虑以下示例: struct TestBase { template<typename T> explicit TestBase(T&& t) : s(std::forward<T>(t)) {} // Compiler refers to this line in the error message TestBase
我有一个函数,可以通过通用引用接受任何类型,并希望为特定类型重载它(其中一些是自己模板化的,虽然我不认为这在这里很重要).不幸的是,我似乎无法以正确的顺序解决重载问题. 我会假设foo的第二个声明会更受欢迎,因为它更具体(模板化程度更低),尽管看起来我对重载解析的理解有些缺乏.有趣的是,改变第二个声明以使X取值,使得它打印“好,好”,并且通过非const引用使其成为X,使其打印“坏,好”.显然,删
在C 11中,可以使用using声明使外部(公共)可访问私有基类的公共成员.例如 class A { private: int i = 2; public: void f() { i = 3; } friend bool operator==(const A& l, const A& r) { return l.i == r.i; } }; class B : priv
使用constexpr,可以在编译时或运行时根据参数计算函数.但通常,算法必须在编译时和运行时之间有所不同.例如.考虑constexpr版本的factorial. constexpr int fact(int n) { return (n)?n*fact(n-1):1; } 如果n在运行时发生,那么函数效率低于一个forloop?是否有一些模板魔术来确定函数是在编译时还是在运行时执行并使用不同的算
我有效地遇到了以下问题:我希望能够使用-Wall -Wextra -Werror进行构建,但是,以下代码会抱怨未使用的参数: struct foo { template <typename... Args> static void bar() { } template <typename T, typename ... Args> static void
这编译: []{}; 这也是: []() mutable {}; 但是使用这段代码,编译器会向我抛出错误消息: [] mutable {}; ^~~~~~~ error: lambda requires '()' before 'mutable' 有什么特别的原因吗? 这只是语法在标准中编写方式的结果.我不知道这是否是疏忽. lambda表达式以lambda导入器(括号)开头,后跟可选的la
在C中,是否可以生成一个深度(维度)等于用户定义输入的嵌套向量?例如,如果用户输入值为2的整数,则一个程序可能会创建一个类型为vector<的对象.矢量<矢量<诠释> >取代.显然,有许多其他方法可以轻松地在C中实现类似的行为,但我纯粹感兴趣的是,是否可以实际生成任意嵌套的向量.最初,我认为这将是相当微不足道的,但我的实现都以相当奇怪的方式失败了. #include<iostream> #incl
阅读 this关于从函数返回右值引用的答案让我思考,如何在C 0x中编写id函数. 基本上,我希望id是一个什么都不做的函数,一个对程序没有可观察影响的函数. 我的第一次尝试如下: #include <iostream> class X { public: X(std::string&& s) : s(std::move(s)) {}; X(const std::string& s) :
我有一个Person类,它有一个name属性(std :: string). 我想创建一个查找表,一个std :: unordered_map,所以我可以通过他们的名字找到一个Person.但是,鉴于一个人,我也希望能够得到他们的名字. 这需要存储两次名称 – 一次作为地图的键,一次存在于人物对象内,如下面的代码所示. 由于我有很多人一次加载到内存中,我不希望两次存储他们的名字的开销. 我尝试在P
编译器供应商已经采用零散的C 11功能,这是可预测的,因为其中许多功能都不易实现. 报告编译器完全支持的规范的标准方法是通过__cplusplus预定义宏.但是,主要供应商报告__cplusplus = 199711L,这意味着他们只是完全支持C 98(例如MSVC14).这(大概)意味着它们并不完全支持C 11规范,即使它们可能实现了大部分功能. 我想开始使用C 11功能,当它们可用时(并且当它
C 1x标准已弃用旧的STL绑定程序函数,而支持更通用的std :: bind.但是,似乎不推荐使用std :: not1和std :: not2来支持通用std :: not_或其他东西.现实是< functional>因为1)缺少lambdas,所以STL的一部分在C 1x之前是非常麻烦的,2)绑定器和否定函子需要嵌套的typedef argument_type,这意味着它们不能用于普通函数3
我有一组模板/函数允许我打印一个元组/对,假设元组/对中的每个类型都有运算符<<为它定义.不幸的是,由于17.4.3.1,添加我的运算符<<超载到标准.有没有其他方法让ADL找到我的操作符<<?如果没有,在命名空间std {}中包装我的重载是否有任何实际损害? 感兴趣的人的代码:(我正在使用 gcc-4.5) namespace tuples { using ::std::tuple; u
我正在学习如何使用条件noexcept并遇到这个问题.假设我有一个班级: template<typename T> class Wrapper { public: Wrapper(T&& value) noexcept(/* ??? */) : value_(std::move(value)) {} private: T value_; }; 为了 /*
我偶然发现了看起来像这样的旧代码: void dothing(bool testBool, const std::string& testString1, const std::string& file, int line, const std::string& defaultS
我最近了解到,自几年以来,库libstdc包含vstring(也称为versa_string),它提供与std :: string相同的功能,但显然更符合C标准.我曾尝试使用vstring作为std :: string的替代品,但我发现没有简单的方法可以做到这一点. 有没有一种简单的方法用vstring替换std :: string而不更改libstdc源? 我可以用别名替换我的代码中std ::
我目前正在将我对C的知识更新为新标准.它让我觉得自己像个小孩子才能拥有最棒的玩具:我想一直玩它但我不想因为它而失去我的朋友. 我参与了一些开源项目,其中一些新功能非常有用,所以我非常热衷于使用它们.我的问题是有多少用户可以编译C 11代码,例如一般公众对C 11完整编译器的采用率是多少?有没有人有相关信息? 我知道gcc 4.8.1和clang 3.3是C 11功能完整,但我不知道有多少人实际使用
在以下代码中: #include <iostream> int main() { const long l = 4294967296; int i = l; return i; //just to silence the compiler } 编译器警告隐式转换(使用-Wall和-std = c 14)如下: warning: implicit conversion from 'con
对于具有相同二进制文件的许多工具链中的API / ABI兼容性,它是 well known that STL容器,std :: string和其他标准库类(如iostream)在公共头文件中是禁止的. (例外情况是,如果为每个受支持的工具链版本分配一个构建;一个为最终用户编译提供没有二进制文件的源,在本例中不是首选选项;或者一个转换为其他一些内联容器,以便不同的std实现不会被库提取.) 如果已经
用什么来替代C中的概念(即将推出的功能)? 你可能听说过C中的概念.这是一个功能 允许您指定模板中类型的要求. 我正在寻找一种方法来做到这一点,我找到的最好的是 Stroustrup的书中他将谓词与static_assert一起使用,如下所示: template<typename Iter, typename Val> Iter find(Iter b, Iter e, Val x) {
我试图在我在C 11中编写的同一个应用程序中使用两个库 LIBSVM和 LIBLINEAR.LIBSVM和LIBLINEAR都将它们的输入用于基本上是基于行的稀疏矩阵表示:有节点结构 struct svm_node { int index; double value; }; 稀疏矩阵本身只是struct svm_node **,其中每一行都是struct svm_node *,行以