我有一个元组类型.我想在其中添加一个元素类型以获得新的元组类型.我可以这样做
decltype tuple_cat(MyTuple, std::tuple<MyType>())
Run Code Online (Sandbox Code Playgroud)
不过,我不觉得tuple_cat在boost::tuple,如何做到这一点的提升?
使用标准容器成员对类实现移动操作的惯用方法不能noexcept,因此不能通过类似的操作移动vector.push_back().还是我弄错了?
为了加快速度
vector<Elem> data;
// ...
data.push_back( elem );
Run Code Online (Sandbox Code Playgroud)
我们鼓励我们进行移动操作noexcept- 因此在向量调整大小期间,库可以安全地将元素移动到重新分配的存储.
class Elem {
// ...
Elem(Elem&&) noexcept; // noexcept important for move
Elem& operator=(Elem&&) noexcept; // noexcept important for move
};
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利,现在我的elems可以更快地被推回.
但是:如果我添加一个容器作为成员,我的班级仍可以标记为noexcept-move吗?所有标准容器都没有移动noexcept!
class Stuff {
vector<int> bulk;
// ...
Stuff(Stuff&& o) // !!! no noexcept because of vector-move
: bulk(move(o.bulk))
{}
Stuff& operator=(Stuff&&) // !!! no noexcept...
{ /* appropriate implementation */ }
};
Run Code Online (Sandbox Code Playgroud)
这也意味着,我们也可以不依赖编译器生成的移动操作,对吧?以下完整的类也没有noexcept …
编译时(使用Linux Server版本6.1)
strftime(AppTime, sizeof(AppTime),"%Y/%m/%d %T", localtime(&((long)u32_Time)));
Run Code Online (Sandbox Code Playgroud)
得到错误"错误:左值需要作为一元'和'操作数'
但是使用Red Hat Enterprise Linux AS第3版成功编译了相同的代码.
为什么这样?怎么纠正这个?
我知道在C++中我们可以这样做:
class A {} a;
Run Code Online (Sandbox Code Playgroud)
这使得一个A名为的对象a.它相当于:
A a;
Run Code Online (Sandbox Code Playgroud)
我想知道如何用模板做这件事.例如:
template <typename T> struct N {} <int> n;
Run Code Online (Sandbox Code Playgroud)
这不会编译,但你明白了.如何为与其类定义内联创建的对象指定模板参数?这甚至可能吗?
最近我一直在玩javascript代码优化来制作HTML5游戏,特别针对移动浏览器.我开始比较引擎并逐渐简化比较代码,我得到了一些我不理解的东西.
我注意到在Chrome中(所以我猜所有基于webkit的浏览器)修改全局变量会导致增加使用的内存.让我举两个例子:
1)修改全局变量:
码:
var globalVariable = 0;
var fps = 60;
window.onload = init;
function init () {
setInterval (loop, 1000/fps);
};
function loop (){
for (var i = 0; i < 1000000; i++) {
globalVariable = Math.random();
}
};
Run Code Online (Sandbox Code Playgroud)
内存时间轴屏幕: 
正如你所看到的,它在前10秒内收集了大量内存!
2)创建局部变量而不是修改全局变量:
代码保持不变,唯一的变化是在循环中添加关键字"var".globalVariable = Math.random(); 变成var localVariable = Math.random();
内存时间轴屏幕: 
正如你所看到的,内存使用率非常低,前10秒它只增加了大约0.1MB.
差异真的很大!我现在无法检查它,但我被告知在两个示例中的Firefox中,两种情况下的内存使用情况看起来几乎相同.
任何人都可以解释我,或指向我解释的资源?或者任何人都可以建议我如何修改全局变量以不增加已用内存?
如果初始化unique_ptr如下:
std::unique_ptr<Foo> i;
i.reset( new Foo() );
Run Code Online (Sandbox Code Playgroud)
但抛出异常Foo::Foo(),问题是:内存分配会发生什么?unique_ptr如何避免泄露?这是在new运营商内部处理的吗?
当范围退出时,肯定会调用析构函数.由于在返回reset之前不调用调用new Foo(),所以new当异常离开构造函数时,似乎必须通过释放分配的内存来处理它.
这是怎么回事?
我试图从向量中获取单个元素并将其推送到向量的后面然后将其删除,这样我就不会在内存中有空的部分.擦除删除习惯用法可以执行此操作,但它会删除特定值的所有实例.我只想删除第一个.
我对标准库算法没有太多经验,我找不到合适的方法(如果有的话)来做到这一点.这是一个例子:
int main() {
std::vector<int> v{1, 2, 3, 3, 4};
remove_first(v, 3);
std::cout << v; // 1, 2, 3, 4
}
Run Code Online (Sandbox Code Playgroud)
那么我该如何从这个向量中删除第一次出现的3?
此代码无法编译:
#include <QString>
/* relevant part:
struct QString
{
~QString() noexcept(false) {};
};
*/
class Base
{
public:
virtual ~Base() = default;
};
class Derived : public Base
{
QString string_;
};
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误是:
error: looser throw specifier for 'virtual Derived::~Derived()'
error: overriding 'virtual Base::~Base() noexcept (true)'
Run Code Online (Sandbox Code Playgroud)
我没有使用异常的经验,但我认为问题是QString析构函数没有异常说明符,因此隐式创建的Derived::~Derived也没有异常说明符.这是隐含的不兼容Base::~Base是noexcept(true).
如果我QString用类noexcept(true)(例如std::string)排除或替换它,代码将编译.
起初我认为我可以通过将两个析构函数声明为noexcept(false):
virtual ~Base() noexcept(false) = default;
virtual ~Derived() noexcept(false) = …Run Code Online (Sandbox Code Playgroud) C++中的引用类型也是POD类型吗?是int&POD类型吗?那怎么样?
struct Q { int& i; }
Run Code Online (Sandbox Code Playgroud)
有人可以帮帮我吗?
来自http://www.cplusplus.com/reference/map/map/operators/我注意到:
"请注意,这些操作都没有考虑任何容器的内部比较对象,而是直接比较元素(类型为value_type)."
这就是说重载的运算符"<" Compare在其声明中没有使用它(参见http://www.cplusplus.com/reference/map/map/)
std::map
template < class Key, // map::key_type
class T, // map::mapped_type
class Compare = less<Key>, // map::key_compare
class Alloc = allocator<pair<const Key,T> > // map::allocator_type
> class map;
Run Code Online (Sandbox Code Playgroud)
其中,Compare为
比较:二元谓词,它将两个元素键作为参数并返回一个
bool.表达式comp(a,b),其中comp是这种类型的对象,a并且b是键值,如果在函数定义的严格弱顺序中a被认为是之前b的那个,则返回true .map对象使用这个表达式来确定元素在容器中遵循的顺序以及两个元素键是否相等(通过比较它们:它们是等效的!comp(a,b) && !comp(b,a)).如果地图容器中没有两个元素可以具有等效键.这可以是函数指针或函数对象(参见构造函数).默认为less<T>,返回与应用less-than运算符相同(a<b).别名为会员类型map::key_compare.
我不太明白,为什么不在Compare"<"运算符中使用?
c++ ×9
c++11 ×4
boost ×1
constructor ×1
containers ×1
exception ×1
html5 ×1
javascript ×1
linux ×1
memory ×1
noexcept ×1
optimization ×1
pod ×1
stl ×1
templates ×1
tuples ×1
webkit ×1