Tag: c ++ 11

C ++ 11初始化程序列表失败 – 但仅限于长度为2的列表

我跟踪了一个模糊的日志logging错误,因为长度为2的初始化列表似乎是一个特例! 这怎么可能? 使用CXXFLAGS=-std=c++11 -stdlib=libc++ ,使用Apple LLVM版本5.1(clang-503.0.40) CXXFLAGS=-std=c++11 -stdlib=libc++ 。 #include <stdio.h> #include <string> #include <vector> using namespace std; typedef vector<string> Strings; void print(string const& s) { printf(s.c_str()); printf("\n"); } void print(Strings const& ss, string const& name) { print("Test " + name); print("Number of strings: " + to_string(ss.size())); for (auto& s: ss) { auto t = […]

类C,构造函数和统一初始化之间有什么区别?

TTBOMK,在C ++中有三种方法来初始化一个variables。 int x = 0; // C-like initialization int x (0); // Constructor initialization int x {0}; // Uniform initialization C ++ 11为统一初始化提供了一个更统一的语法来初始化不同types的variables,这些variables在C ++ 03中需要不同的语法。 类C,构造函数和统一初始化之间有什么区别? 我应该总是使用统一的初始化?

decltype和括号

我不明白FCD第148页示例的最后一行(§7.6.1.2/ 4): const int&& foo(); int i; struct A { double x; }; const A* a = new A(); decltype(foo()) x1 = i; // type is const int&& decltype(i) x2; // type is int decltype(a->x) x3; // type is double decltype((a->x)) x4 = x3; // type is const double& 为什么括号在这里有所作为? 它不应该简单地像上面那样是double吗?

是否有RValue Reference(&&)的返回有用的情况?

当一个函数应该返回一个RValue引用时是否有一个原因? 技巧,技巧,成语或模式? MyClass&& func( … ); 我知道一般返回引用的危险,但有时候我们也是这么做的,难道我们( T& T::operator=(T)只是一个习惯用法的例子)。 但是T&& func(…)怎么样? 我们可以从中获益吗? 当你编写库或API代码时,与仅仅客户端代码相比,可能会有所不同?

通过引用在C ++ 11 lambda中捕获参考

考虑这个: #include <functional> #include <iostream> std::function<void()> make_function(int& x) { return [&]{ std::cout << x << std::endl; }; } int main() { int i = 3; auto f = make_function(i); i = 5; f(); } 这个程序保证输出5而不会调用未定义的行为? 我知道它是如何工作的,如果我通过值捕获x ( [=] ),但我不确定是否通过引用捕获它来调用未定义的行为。 难道是在make_function返回之后,我最终会得到一个make_function引用,或者只要最初引用的对象仍然存在,被捕获的引用就能保证工作? 在这里寻找明确的基于标准的答案:) 到目前为止 ,它在实践中运作良好;)

thread_local在C ++ 11中意味着什么?

我对C ++ 11中的thread_local的描述感到困惑。 我的理解是,每个线程都有一个函数中局部variables的唯一副本。 全局/静态variables可以被所有线程访问(可能使用locking同步访问)。 thread_localvariables对所有线程都是可见的,但是只能由定义它们的线程修改。 这是对的吗?

为什么std :: shared_ptr <void>工作

我发现一些代码使用std :: shared_ptr在关机时执行任意清理。 起初我以为这个代码不可能工作,但后来我尝试了以下几点: #include <memory> #include <iostream> #include <vector> class test { public: test() { std::cout << "Test created" << std::endl; } ~test() { std::cout << "Test destroyed" << std::endl; } }; int main() { std::cout << "At begin of main.\ncreating std::vector<std::shared_ptr<void>>" << std::endl; std::vector<std::shared_ptr<void>> v; { std::cout << "Creating test" << std::endl; v.push_back( […]

在类的函数声明之后,“default”是什么意思?

我已经看到在类中的函数声明旁边使用的default 。 它有什么作用? class C { C(const C&) = default; C(C&&) = default; C& operator=(const C&) & = default; C& operator=(C&&) & = default; virtual ~C() { } };

为什么lambda可以比普通函数更好地被编译器优化?

在他的书The C++ Standard Library (Second Edition) Nicolai Josuttis指出,编译器比普通函数可以更好地优化lambdaexpression式。 另外,C ++编译器比普通函数更好地优化lambdaexpression式。 (页213) 这是为什么? 我认为当谈到内联时,应该没有任何区别了。 我能想到的唯一原因是编译器可能有一个更好的lambdaexpression式的本地环境,这样可以做更多的假设和执行更多的优化。

“覆盖”关键字只是检查重写的虚拟方法吗?

据我所知,在C ++ 11中引入override关键字只不过是一个检查,以确保正在实现的function是在基类中的virtual函数的override 。 是吗?