给定两个相同的boost::variant实例a和b,表达( a == b )是允许的.
但( a != b )似乎未定义.为什么是这样?
在我的代码库中有几个地方,对于大型数据集,相同的操作重复了很多次.在某些情况下,处理这些需要相当长的时间.
我相信使用SSE来实现这些循环应该会显着提高它们的性能,特别是在对同一组数据执行许多操作的情况下,所以一旦数据最初被读入缓存,就不应该有任何缓存未命中它.但是,我不确定是否会这样做.
是否有编译器和OS独立的方式编写代码以利用SSE指令?我喜欢VC++内在函数,其中包括SSE操作,但我还没有找到任何交叉编译器解决方案.
我仍然需要支持一些没有或有限SSE支持的CPU(例如Intel Celeron).有没有办法避免不得不制作不同版本的程序,比如有一种"运行时链接器"链接在基本或SSE优化代码基于运行进程时运行它的CPU?
那么其他CPU扩展怎么样,看看各种Intel和AMD CPU的指令集,其中有几个?
Boost的make_shared()功能有望在尝试创建时具有异常安全性shared_ptr.
为什么没有make_scoped()相应的?有一个共同的最佳做法吗?
这是一个对我来说似乎不安全的boost::scoped_ptr文档中的代码示例:
boost::scoped_ptr<Shoe> x(new Shoe);
Run Code Online (Sandbox Code Playgroud)
这行代码将按顺序执行以下三项操作:
ShoeShoeboost::scoped_ptr<Shoe>如果构造函数Shoe抛出异常, 内存将被泄露. (见R.费尔南德斯Martinho的答案) 的scoped_ptr,因为它没有被构建但不会处理重新分配.
这是疏忽吗?还是有一个我没注意到的解决方案?
std::variant可以进入一种称为“ 异常无价值 ”的状态。
据我了解,这是导致移动分配抛出异常的常见原因。不能保证该变体的旧值不再存在,预期的新值也不是。
std::optional,但是没有这种状态。cppreference提出了大胆的主张:
如果引发异常,则* this ...的初始化状态不变,即,如果对象包含一个值,则它仍然包含一个值,反之亦然。
如何std::optional避免变得“异常无价值”而std::variant不能避免?
我正在将一些C++代码移植到C#.
C#是否具有相同std::nth_element()或者我需要自己滚动?
当使用doxygen生成C++继承图时,我注意到图表可能不完整.
如果使用标记文件记录多个项目以允许交叉引用,则doxygen将成功显示其他标记文件中存在的所有基类,但如果它们位于其他标记文件中,则不会显示派生类.显示的派生类始终只是当前项目中存在的类.
示例项目1代码:
class A {};
class B : public A {};
class C : public A {};
Run Code Online (Sandbox Code Playgroud)
示例项目2代码:
#include <proj1.h>
class D : public A {};
class E : public A {};
class F : public E {};
Run Code Online (Sandbox Code Playgroud)
A项目1 的继承图,使用项目2中的标记文件 - 其中D,E&F?
E使用项目1中的标记文件 - 父类A显示项目2 的继承图.
是否有设置告诉doxygen在使用标记文件时跨项目生成完整的继承图?
C++ 11正则表达式是否有完整/正确的实现(现在)?
关于编译器支持与库支持的注意事项:
编译器支持 =编译器识别添加到相关功能的语言的任何新语法.使用添加到程序中的新功能的代码将编译.
Library Support =库已更新以实际实现该功能.添加到您的程序并链接到库的代码将起作用.
*编辑:我已使用新信息更新了此摘要,并将其移至下面的答案中.
在使用智能指针的C++项目中,例如boost::shared_ptr,使用" this" 的好设计理念是什么?
考虑一下:
存储任何智能指针中包含的原始指针以供以后使用是危险的.您已放弃对对象删除的控制,并信任智能指针以在正确的时间执行此操作.
非静态类成员本质上使用this指针.它是一个原始指针,无法更改.
如果我存储this在另一个变量或把它传递给这有可能保存它供以后或在回调绑定它的另一个功能,我创建的引入当有人决定做一个共享指针,以我的课的错误.
鉴于此,我何时适合明确使用this指针? 是否有设计范例可以防止与此相关的错误?
将可变参数模板的参数包含在初始化程序列表中应该确保它们按顺序进行评估,但不会在此处进行:
#include <iostream>
using namespace std;
template<class T> void some_function(T var)
{
cout << var << endl;
}
struct expand_aux {
template<typename... Args> expand_aux(Args&&...) { }
};
template<typename... Args> inline void expand(Args&&... args)
{
bool b[] = {(some_function(std::forward<Args>(args)),true)...}; // This output is 42, "true", false and is correct
cout << "other output" << endl;
expand_aux temp3 { (some_function(std::forward<Args>(args)),true)... }; // This output isn't correct, it is false, "true", 42
}
int main()
{
expand(42, "true", false);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
怎么会?
我猜(某些)隐式转换在传递非类型模板参数时适用.例如,应该有从一个转换int到std::size_t用于表达喜欢std::array<int, 7>.但是,请考虑以下代码:
template <bool>
void f() {
std::cout << "false\n";
}
template <>
void f<true>() {
std::cout << "true\n";
}
int main() {
f<1>();
f<4>();
f<0>();
}
Run Code Online (Sandbox Code Playgroud)
我希望int隐式转换到bool这里.但VC,GCC和clang的行为不同.
在VC, ,true,false和false打印,这实在是怪我.
在海湾合作委员会,true,true,和false印,这是我的期望.
在clang上,由于语句,代码根本不编译f<4>();.
候选模板被忽略:第一个模板参数的显式指定参数无效
那么,标准对此有何看法?非类型模板参数的隐式转换规则是什么?
c++ templates type-conversion template-specialization implicit-conversion
c++ ×9
c++11 ×2
templates ×2
boost ×1
c# ×1
c++17 ×1
doxygen ×1
gcc ×1
inheritance ×1
make-shared ×1
nth-element ×1
oop ×1
pointers ×1
regex ×1
scoped-ptr ×1
shared-ptr ×1
simd ×1
std-variant ×1
stdoptional ×1
stl ×1
this ×1
visual-c++ ×1