小编HC4*_*ica的帖子

c ++ 11 lambdas捕获他们不使用的变量吗?

当我[=]用来表示我希望所有局部变量都被lambda中的值捕获时,是否会导致被复制的函数中的所有局部变量,或者只是lambda使用的所有局部变量?

所以,例如,如果我有:

vector<int> my_huge_vector(100000);
int my_measly_int;
some_function([=](int i){ return my_measly_int + i; });
Run Code Online (Sandbox Code Playgroud)

my_huge_vector会被复制,即使我不在lambda中使用它吗?

c++ lambda c++11

120
推荐指数
2
解决办法
2万
查看次数

在类定义中定义静态const整数成员

我的理解是C++允许在类中定义静态const成员,只要它是整数类型即可.

那么,为什么以下代码会给我一个链接器错误?

#include <algorithm>
#include <iostream>

class test
{
public:
    static const int N = 10;
};

int main()
{
    std::cout << test::N << "\n";
    std::min(9, test::N);
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

test.cpp:(.text+0x130): undefined reference to `test::N'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

有趣的是,如果我注释掉对std :: min的调用,代码编译和链接就好了(即使test :: N也在前一行引用).

知道发生了什么事吗?

我的编译器是Linux上的gcc 4.4.

c++ static declaration definition

105
推荐指数
6
解决办法
9万
查看次数

Visual Studio 2012中的C++ 11功能

Visual Studio 2012的预览版(VS2010之后的下一个版本)现已推出.

有谁知道它支持哪些新的C++ 11功能?(我现在无法试一试).

c++ visual-c++ c++11 visual-c++-2012

94
推荐指数
4
解决办法
6万
查看次数

在CDT之上安装Eclipse JDT

我安装了eclipse CDT,我想在我的CDT安装之上安装Java开发功能(JDT).我一直在谷歌搜索,但我无法弄清楚如何做到这一点.

我需要安装什么插件?我需要使用哪个更新站点?

eclipse eclipse-cdt eclipse-jdt

69
推荐指数
1
解决办法
5万
查看次数

C++ 11是否允许vector <const T>?

容器需求已从C++ 03更改为C++ 11.虽然C++ 03有一揽子要求(例如复制构造性和向量的可赋值性),但C++ 11定义了每个容器操作的细粒度要求(第23.2节).

因此,只要您只执行某些不需要赋值的操作(构造并且push_back是这样的操作),您可以例如在向量中存储可复制构造但不可赋值的类型(例如具有const成员的结构).; insert不是).

我想知道的是:这是否意味着标准现在允许vector<const T>?我没有看到任何理由它不应该 - const T就像具有const成员的结构一样,是一种可复制构造但不可分配的类型 - 但我可能错过了一些东西.

(让我觉得我可能错过了一些东西的部分原因是,如果你试图实例化vector<const T>,那gcc trunk会崩溃并烧掉,但是vector<T>对于T有const成员的地方来说很好).

c++ const vector c++11

65
推荐指数
4
解决办法
1万
查看次数

为什么emplace_back()不使用统一初始化?

以下代码:

#include <vector>

struct S
{
    int x, y;
};

int main()
{
    std::vector<S> v;
    v.emplace_back(0, 0);
}
Run Code Online (Sandbox Code Playgroud)

使用GCC编译时出现以下错误:

In file included from c++/4.7.0/i686-pc-linux-gnu/bits/c++allocator.h:34:0,
                 from c++/4.7.0/bits/allocator.h:48,
                 from c++/4.7.0/vector:62,
                 from test.cpp:1:
c++/4.7.0/ext/new_allocator.h: In instantiation of 'void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up = S; _Args = {int, int}; _Tp = S]':
c++/4.7.0/bits/alloc_traits.h:265:4:   required from 'static typename std::enable_if<std::allocator_traits<_Alloc>::__construct_helper<_Tp, _Args>::value, void>::type std::allocator_traits<_Alloc>::_S_construct(_Alloc&, _Tp*, _Args&& ...) [with _Tp = S; _Args = {int, int}; _Alloc = std::allocator<S>; typename std::enable_if<std::allocator_traits<_Alloc>::__construct_helper<_Tp, _Args>::value, void>::type = void]'
c++/4.7.0/bits/alloc_traits.h:402:4:   required …
Run Code Online (Sandbox Code Playgroud)

c++ vector uniform-initialization c++11

61
推荐指数
1
解决办法
6634
查看次数

lambdas需要捕获'this'来调用静态成员函数?

对于以下代码:

struct B
{
    void g()
    {
        []() { B::f(); }();
    }

    static void f();
};
Run Code Online (Sandbox Code Playgroud)

g ++ 4.6给出错误:

test.cpp:在lambda函数中:
test.cpp:44:21:错误:这个lambda函数没有捕获'this'

(有趣的是,g ++ 4.5编译代码很好).

这是g ++ 4.6中的错误,还是真的有必要捕获'this'参数才能调用静态成员函数?我不明白为什么会这样,我甚至认可了这个电话B::.

c++ lambda c++11

56
推荐指数
1
解决办法
3万
查看次数

为什么从C++ 11中删除了对范围访问?

我刚刚发现,在某一点上,C++ 11草案具有std::begin/ std::end重载std::pair,允许将一对迭代器视为适合在基于范围的for循环中使用的范围(N3126,第20.3.5.5节),但这有自从被删除.

有谁知道为什么它被删除了?

我发现删除非常不幸,因为似乎没有其他方法可以将一对迭代器视为范围.确实:

  • 在基于范围的for循环中开始/结束的查找规则表示在1)中作为范围对象2)的成员函数查找开始/结束作为"关联命名空间"中的自由函数
  • std::pair 没有开始/结束成员函数
  • 通常唯一关联的命名空间std::pair<T, U>是namespace std
  • 我们不允许超载std::begin/ std::endstd::pair自己
  • 我们不能专门化std::begin/ std::endfor std::pair(因为专业化必须是部分的,而且不允许使用函数)

还有其他一些我失踪的方式吗?

c++ foreach range c++11 std-pair

54
推荐指数
3
解决办法
8009
查看次数

std :: tuple get()成员函数

boost::tuple有一个get()像这样使用的成员函数:

tuple<int, string, string> t(5, "foo", "bar");
cout << t.get<1>();  // outputs "foo"
Run Code Online (Sandbox Code Playgroud)

看来C++ 0x std::tuple没有这个成员函数,你必须改为使用非成员函数形式:

std::get<1>(t);
Run Code Online (Sandbox Code Playgroud)

对我来说看起来更丑陋.

是否有任何特殊原因std::tuple没有会员功能?或者只是我的实施(GCC 4.4)?

c++ boost tuples c++11

49
推荐指数
3
解决办法
1万
查看次数

本地班级的会员模板

给出以下代码:

 void f()
 {
     class A
     {
         template <typename T>
         void g() {}
     };
 }
Run Code Online (Sandbox Code Playgroud)

g ++ 4.4(以及 g++-4.6 -std=gnu++0x)抱怨:"本地类中成员模板的声明无效".

显然,本地类不允许有模板成员.这种限制的目的是什么?它会在C++ 0x中删除吗?

注意:如果我将本地类本身设为模板,而不是给它一个模板成员:

 void f()
 {
     template <typename T>         
     class A
     {
         void g() {}
     };
 }
Run Code Online (Sandbox Code Playgroud)

我得到"错误:模板声明不能出现在块范围内".

c++ templates local-class c++11

46
推荐指数
1
解决办法
1万
查看次数