当我[=]用来表示我希望所有局部变量都被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++允许在类中定义静态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.
Visual Studio 2012的预览版(VS2010之后的下一个版本)现已推出.
有谁知道它支持哪些新的C++ 11功能?(我现在无法试一试).
我安装了eclipse CDT,我想在我的CDT安装之上安装Java开发功能(JDT).我一直在谷歌搜索,但我无法弄清楚如何做到这一点.
我需要安装什么插件?我需要使用哪个更新站点?
容器需求已从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成员的地方来说很好).
以下代码:
#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) 对于以下代码:
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++ 11草案具有std::begin/ std::end重载std::pair,允许将一对迭代器视为适合在基于范围的for循环中使用的范围(N3126,第20.3.5.5节),但这有自从被删除.
有谁知道为什么它被删除了?
我发现删除非常不幸,因为似乎没有其他方法可以将一对迭代器视为范围.确实:
std::pair 没有开始/结束成员函数std::pair<T, U>是namespace stdstd::begin/ std::end为std::pair自己std::begin/ std::endfor std::pair(因为专业化必须是部分的,而且不允许使用函数)还有其他一些我失踪的方式吗?
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)?
给出以下代码:
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++ ×9
c++11 ×8
lambda ×2
vector ×2
boost ×1
const ×1
declaration ×1
definition ×1
eclipse ×1
eclipse-cdt ×1
eclipse-jdt ×1
foreach ×1
local-class ×1
range ×1
static ×1
std-pair ×1
templates ×1
tuples ×1
visual-c++ ×1