有了新的标准,就会有新的做事方式,而且许多方式比旧方法更好,但旧的方式仍然很好.由于向后兼容的原因,新标准也没有正式弃用.所以剩下的问题是:
旧的编码方式肯定不如C++ 11样式,我们现在可以做些什么呢?
在回答这个问题时,你可以跳过诸如"使用自动变量"之类的显而易见的事情.
Stack Overflow教给我的很多东西都是所谓的"最令人烦恼的解析",经典地用一条线来证明
A a(B()); //declares a function
Run Code Online (Sandbox Code Playgroud)
虽然这对于大多数人而言,直观地看起来是a类型对象的声明A,将临时B对象作为构造函数参数,它实际上是一个函数a返回的声明A,将一个指针指向一个返回的函数,它B本身不带参数.同样的线
A a(); //declares a function
Run Code Online (Sandbox Code Playgroud)
也属于同一类别,因为它代替一个对象,它声明了一个函数.现在,在第一种情况下,这个问题的通常解决方法是在其周围添加一组额外的括号/括号B(),因为编译器会将其解释为对象的声明
A a((B())); //declares an object
Run Code Online (Sandbox Code Playgroud)
但是,在第二种情况下,执行相同操作会导致编译错误
A a(()); //compile error
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么?是的我非常清楚正确的"解决方法"是将其更改为A a;,但我很想知道()第一个示例中的额外功能是什么,然后在重新应用它时不起作用第二个例子.A a((B()));变通办法是否是写入标准的特定异常?
使用C++ 11,我们现在可以在头声明中初始化类成员:
class aClass
{
private:
int mInt{100};
public:
aClass();
~aClass();
};
Run Code Online (Sandbox Code Playgroud)
所以我有点困惑.传统上,构造函数中的初始化列表已用于成员初始化:
aClass::aClass()
: mInt(100)
{
...
}
Run Code Online (Sandbox Code Playgroud)
声明中的新C++ 11成员初始化功能是否使初始化列表过时了?如果没有,一个优于另一个的优势是什么?什么情况会使声明初始化有利,或初始化列表有利?应该何时使用另一个?
可能重复:
make_unique和完美转发
为什么C++ 11有make_shared模板,但不是make_unique模板?
这使得代码非常不一致.
auto x = make_shared<string>("abc");
auto y = unique_ptr<string>(new string("abc"));
Run Code Online (Sandbox Code Playgroud) 根据std :: shufle上的cppreference.com参考站点,在c ++ 14中不推荐使用以下方法:
template< class RandomIt >
void random_shuffle( RandomIt first, RandomIt last );
Run Code Online (Sandbox Code Playgroud)
为什么我们不再能够在不传递第三个参数的情况下调用以下函数?
std::random_shuffle(v.begin(),v.end()); //no longer valid in c++14
Run Code Online (Sandbox Code Playgroud)
看起来好像不同的功能减速具有默认参数设置.这背后的原因是什么?是否添加了某种替代方案?
我可以在初始化struct Foo时执行此操作:
Foo foo = {bunch, of, things, initialized};
Run Code Online (Sandbox Code Playgroud)
但是,我不能这样做:
Foo foo;
foo = {bunch, of, things, initialized};
Run Code Online (Sandbox Code Playgroud)
那么,有两个问题:
我怎样才能做类似于第二个例子的事情,即在已经初始化之后在一行代码中为结构声明一堆变量?我试图避免必须为具有许多变量的大型结构执行此操作:
Foo foo;
foo.a = 1;
foo.b = 2;
foo.c = 3;
//... ad infinitum
Run Code Online (Sandbox Code Playgroud)是否允许标准:
struct A
{
int a = 3;
int b = 3;
};
A a{0,1}; // ???
Run Code Online (Sandbox Code Playgroud)
这个课程仍然是聚合的吗?
clang接受此代码,但gcc不接受.
虽然随机引擎需要在每个编译器上给出相同的数字序列.至少一些随机分布不是,只要求它们满足统计和概率阈值.举个例子:
#include <random>
#include <iostream>
int main() {
std::mt19937 foo;
std::uniform_int_distribution<int> bar(0, 1000);
for (int i=0; i<99; ++i) {
bar(foo);
}
std::cout << bar(foo) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当根据(我的版本)libstdc ++和89编译时,将针对libc ++编译时打印808.
无论您给出的合规环境如何,哪些标准提供的分配功能(如果有)可以保证产生一致的结果?
是否有任何例子,模板元编程比新的constexpr更好用?根据我的理解,constexpr和模板元编程都有类似的用途,但模板元编程并不过时.因此,必须有一些示例,其中模板元编程优于constexpr.对此有任何共同的想法将非常感谢,谢谢!
根据优化C++,
对于您确定永远不会抛出异常的函数,使用空的异常规范(即,对声明追加throw()).
如果我知道90%的方法都不会抛出异常怎么办?将throw()附加到所有这些方法似乎是非常规和冗长的.如果没有,有什么好处?或者我在这里误解了什么?
c++ ×10
c++11 ×7
c++14 ×2
c ×1
c++-faq ×1
constexpr ×1
constructor ×1
declaration ×1
deprecated ×1
gcc ×1
optimization ×1
random ×1
struct ×1
throw ×1