我正在阅读关于参数相关查找 的C ++编程语言第4版 (由Bjarne Stroustrup撰写 )。 这里是引用(26.3.6,过度的ADL): 依赖于参数的查找(通常称为ADL)对于避免冗长是非常有用的(14.2.4)。 例如: #include <iostream> int main() { std::cout << "Hello, world" << endl; // OK because of ADL } 没有依赖于参数的查找, endl操纵器将不会被发现。 实际上,编译器注意到<<的第一个参数是std定义的一个ostream 。 因此,它在std查找endl并find它(在<iostream> )。 这里是编译器(C ++ 11模式)产生的结果 : prog.cpp: In function 'int main()': prog.cpp:4:36: error: 'endl' was not declared in this scope std::cout << "Hello, world" << […]
我目前正在进行一个项目,我有以下问题。 我有一个C ++方法,我想以两种不同的方式工作: void MyFunction() { foo(); bar(); foobar(); } void MyFunctionWithABonus() { foo(); bar(); doBonusStuff(); foobar(); } 而且我不想复制我的代码,因为实际的function更长。 问题是我不能在任何情况下调用MyFunction而不是MyFunctionWithABonus来为程序添加执行时间。 这就是为什么我不能只有一个布尔参数,我检查与C + +比较。 我的想法本来是使用C ++模板来虚拟复制我的代码,但我想不出一种做法,我没有额外的执行时间,我不必复制代码。 我不是模板的专家,所以我可能会错过一些东西。 你们有没有想法? 还是在C + + 11是不可能的?
我在理解C ++ 0x中std::result_of的需求时遇到了一些麻烦。 如果我理解正确, result_of用于获取调用具有某些types参数的函数对象的结果types。 例如: template <typename F, typename Arg> typename std::result_of<F(Arg)>::type invoke(F f, Arg a) { return f(a); } 我真的没有看到与以下代码的区别: template <typename F, typename Arg> auto invoke(F f, Arg a) -> decltype(f(a)) //uses the f parameter { return f(a); } 要么 template <typename F, typename Arg> auto invoke(F f, Arg a) -> decltype(F()(a)); […]
在使用C ++ 11的线程模型时,我注意到了这一点 std::packaged_task<int(int,int)> task([](int a, int b) { return a + b; }); auto f = task.get_future(); task(2,3); std::cout << f.get() << '\n'; 和 auto f = std::async(std::launch::async, [](int a, int b) { return a + b; }, 2, 3); std::cout << f.get() << '\n'; 似乎做了完全一样的事情。 我明白,如果我用std::launch::deferred运行std::async ,但是在这种情况下有一个主要区别吗? 这两种方法有什么区别,更重要的是,我应该在哪些用例上使用它们呢?
std::array远远优于C数组。 即使我想与遗留代码进行互操作,我也可以使用std::array::data() 。 有没有什么原因我会想要一个老式的arrays?
我正在使用C ++中的一些lambdas的内存,但是我对它们的大小感到有点困惑。 这是我的testing代码: #include <iostream> #include <string> int main() { auto f = [](){ return 17; }; std::cout << f() << std::endl; std::cout << &f << std::endl; std::cout << sizeof(f) << std::endl; } 你可以在这里运行它: http : //fiddle.jyt.io/github/b13f682d1237eb69ebdc60728bb52598 ouptut是: 17 0x7d90ba8f626f 1 这表明我的lambda的大小是1。 这怎么可能? lambda是不是应该至less指向它的实现?
下面的代码是相当微不足道的,我希望它应该编译好。 struct A { struct B { int i = 0; }; B b; A(const B& _b = B()) : b(_b) {} }; 我用g ++版本4.7.2,4.8.1,clang ++ 3.2和3.3testing了这个代码。 除了这个代码( http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57770 )上的g ++ 4.7.2段错误之外,其他testing编译器给出的错误信息并不能解释太多。 g ++ 4.8.1: test.cpp: In constructor 'constexpr A::B::B()': test.cpp:3:12: error: constructor required before non-static data member for 'A::B::i' has been parsed struct B […]
我知道函数是什么,什么时候使用它们与stl算术。 但不明白他在这个话题中的含义: C ++ 11FAQ 任何一个可以解释什么std::bind和std::function是什么时候应该使用,一些新手的例子?
如果我有一个函数内的variables(比如说一个大数组),声明它是static还是constexpr有意义的? constexpr保证数组是在编译时创build的,那么static是无用的吗? void f() { static constexpr int x [] = { // a few thousand elements }; // do something with the array } static实际上是根据生成的代码还是语义来做任何事情?
有没有办法将enum class字段转换为基础types? 我认为这是自动的,但显然不是。 enum class my_fields : unsigned { field = 1 }; unsigned a = my_fields::field; 海湾合作委员会拒绝了这项任务。 error: cannot convert 'my_fields' to 'unsigned int' in assignment 。