Tag: c ++ 11

什么时候在编译时才会对constexpr函数进行评估?

由于可能在运行时调用一个声明为constexpr的函数,编译器决定是在编译时还是在运行时计算它? template<typename base_t, typename expo_t> constexpr base_t POW(base_t base, expo_t expo) { return (expo != 0 )? base * POW(base, expo -1) : 1; } int main(int argc, char** argv) { int i = 0; std::cin >> i; std::cout << POW(i, 2) << std::endl; return 0; } 在这种情况下,我在编译时是未知的,这可能是编译器将POW()作为在运行时调用的常规函数​​的原因。 然而,这种dynamic,似乎很方便,有一些不切实际的影响。 例如,在编译期间,是否可能会有编译器计算constexpr函数的情况,编译器决定将其作为一个普通函数来处理,而编译期间它也能工作? 有什么已知的常见陷阱?

C ++ 11中的recursionlambda函数

我是C ++ 11的新手。 我正在写下面的recursionlambda函数,但它不能编译。 sum.cpp #include <iostream> #include <functional> auto term = [](int a)->int { return a*a; }; auto next = [](int a)->int { return ++a; }; auto sum = [term,next,&sum](int a, int b)mutable ->int { if(a>b) return 0; else return term(a) + sum(next(a),b); }; int main(){ std::cout<<sum(1,10)<<std::endl; return 0; } 编译错误: vimal @ linux-718q:〜/ […]

如何从迭代中删除地图?

如何在迭代时从地图中删除? 喜欢: std::map<K, V> map; for(auto i : map) if(needs_removing(i)) // remove it from the map 如果我使用map.erase它将使迭代器无效

如何使用模板将lambda转换为std :: function

基本上,我想要能够做的就是带任意数量的任何types的参数的lambda,并将其转换为一个std ::函数。 我已经尝试了以下两种方法的工作。 std::function([](){});//Complains that std::function is missing template parameters template <typename T> void foo(function<T> f){} foo([](){});//Complains that it cannot find a matching candidate 下面的代码可以工作,但是这不是我想要的,因为它需要显式声明不适用于generics代码的模板参数。 std::function<void()>([](){}); 我一直在使用函数和模板整夜,我只是无法弄清楚,所以任何帮助将不胜感激。 正如在评论中提到的,我试图做到这一点的原因是因为我试图使用可变参数模板在C ++中实现柯里化。 不幸的是,这在使用lambda时会失败。 例如,我可以使用函数指针传递一个标准函数。 template <typename R, typename…A> void foo(R (*f)(A…)) {} void bar() {} int main() { foo(bar); } 但是,我不知道如何将lambda传递给这样一个可变参数的函数。 为什么我有兴趣将genericslambda转换成std :: function是因为我可以做到以下几点,但是最终它要求我明确地将模板参数声明为std :: function,这正是我想要避免的。 template <typename […]

在基于范围for循环中使用通用引用的优点是什么?

如果我想执行只读操作, const auto&就足够了。 但是,我碰到了 for (auto&& e : v) // v is non-const 最近几次。 这让我想知道: 是否有可能在一些不起眼的angular落案例中使用通用引用有一些性能优势,与auto& or const auto&相比? ( shared_ptr是一个晦涩的angular落案件的嫌疑犯) 更新我在我的collections中find的两个例子: 迭代基本types时使用const引用的任何缺点? 我可以使用基于范围的for循环轻松地迭代地图的值吗? 请专注于这个问题: 为什么我要在基于范围的for循环中使用auto &&?

在C ++ 11中支持Unicode有多好?

我读过并且听说C ++ 11支持Unicode。 有几个问题: C ++标准库如何支持Unicode? std::string应该做什么? 我如何使用它? 潜在的问题在哪里?

什么时候应该使用noexcept?

noexcept关键字可以适用于许多函数签名,但我不确定在实际中何时应该考虑使用它。 根据我迄今为止所读到的内容, noexcept的最后一刻似乎解决了移动构造函数抛出时出现的一些重要问题。 但是,我仍然无法为一些实际问题提供令人满意的答案,这些问题使我更多地了解了noexcept 。 有很多函数的例子,我知道永远不会抛出,但编译器无法自己确定。 在所有这些情况下,我是否应该在函数声明中添加noexcept的内容? 不得不考虑每个函数声明之后是否需要附加noexcept ,这将大大降低程序员的生产力(坦率地说,这将是一个痛苦的屁股)。 对于哪种情况,我应该更加小心使用noexcept ,并且在哪些情况下我可以逃避隐含的noexcept(false) ? 什么时候可以切实地期望在使用noexcept之后观察性能改进? 具体来说,给出一个代码,在添加noexcept之后,C ++编译器能够生成更好的机器代码。 就我个人而言,由于为编译器提供了更多的自由度来安全地应用某些优化,我关心的是noexcept 。 现代编译器以这种方式利用noexcept吗? 如果没有,我可以指望他们中的一些人在不久的将来这样做吗?

如何在C ++ 11中有效地select标准库容器?

有一个众所周知的图像(备忘单)称为“C ++容器的select”。 这是一个stream程图,select最好的容器为所需的用法。 有人知道它是否已经有了C ++ 11的版本吗? 这是前一个:

C ++ 11引入了标准化的内存模型。 这是什么意思? 那么如何影响C ++编程呢?

C ++ 11引入了标准化的内存模型,但究竟是什么意思呢? 那么如何影响C ++编程呢? 香草萨特在这里说, 内存模型意味着C ++代码现在有一个标准化的库来调用,不pipe编译器是谁做的,在哪个平台上运行。 有一个标准的方法来控制不同的线程如何与处理器的内存交谈。 Sutter说:“当你谈论的是跨标准的不同核心进行拆分时,我们正在谈论内存模型。我们将会优化它,而不会破坏人们在代码中所做的下列假设。 那么,我可以记住这个在线类似的段落(因为我已经有自己的记忆模型,自诞生以来:P),甚至可以回答别人提出的问题,但说实话,我不完全明白这一点。 所以,我基本上想知道的是,C ++程序员甚至在之前就开发了multithreading应用程序,所以如果是POSIX线程,Windows线程或者C ++ 11线程,它又有什么关系呢? 有什么好处? 我想了解低级细节。 我也感觉到C ++ 11内存模型与C ++ 11multithreading支持有某种联系,因为我经常将这两者结合在一起。 如果是这样,究竟是如何? 他们为什么要相关? 因为我不知道multithreading的内部工作原理,以及一般的内存模型意味着什么,所以请帮助我理解这些概念。 🙂

为什么C ++ 11删除的函数参与重载parsing?

为什么C ++ 11使“ delete d”函数参与重载parsing ? 为什么这是有用的? 换句话说,为什么他们隐藏起来而不是完全被删除?