这个 Github 存储库将 std::regex 添加到正则表达式引擎列表中,但被其他引擎淘汰了。
为什么 std::regex - 在 libstdc++ 中实现 - 比其他的慢得多?这是因为 C++ 标准要求还是只是特定的实现没有得到很好的优化?
同样在枪战中,即使添加了 std::regex::extended 标志,std::regex 也无法编译所有其他人都接受的几个正则表达式。他们是(?i)Twain、、、、和。\b\w+nn\b(?i)Tom|Sawyer|Huckleberry|Finn\s[a-zA-Z]{0,12}ing\s([A-Za-z]awyer|[A-Za-z]inn)\s\p{Sm}
更新:添加了与 boost::regex 的比较。
UPDATE2:添加了ctre
当我正在开发一个将于2014年左右公开发布的C++库时,我目前正在做出设计选择.使用C++ 14发布的非常有用的工具之一是std::optional.我想知道g++/libstdc++我期望使用哪个版本的版本-std=c++1y.
我发现gcc(4.9.2)和clang(3.5.0)之间的行为有所不同,令我感到惊讶.
当我尝试unsigned int从一个std::istringstream带有负值的初始值(在示例中为"-15")中提供一个时,我得到了
fail()clang ++ 出错(带位)signed(-15)用gcc ++ 初始化我准备了以下示例程序.
#include <sstream>
#include <iostream>
int main ()
{
std::istringstream iss("-15");
unsigned int ui;
iss >> ui;
std::cout << "ui[" << ui << "] signed(ui)[" << signed(ui)
<< "] flags[" << iss.fail() << iss.good() << iss.bad()
<< iss.eof() << "]\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用clang ++,我获得以下输出
ui[0] signed(ui)[0] flags[1001]
Run Code Online (Sandbox Code Playgroud)
使用g ++,我获得以下输出
ui[4294967281] signed(ui)[-15] flags[0001]
Run Code Online (Sandbox Code Playgroud)
我有两个问题.
首先是显而易见的:谁是对的?clang ++,g ++还是一个未定义的行为?
第二个是:我如何强制gcc ++的行为类似于clang ++,从一个以减号开头的字符串中提取无符号值时会出错?
谢谢,抱歉我的英语不好.
编辑2016.04.03
我意识到这不是g ++和clang ++之间的区别,而是libstd …
假设我有两个std::vector<uint_32> a, b;我知道具有相同大小的向量.
是否有一个C++ 11范式做一个bitwise-AND所有成员之间a和b,并把结果std::vector<uint_32> c;?
鉴于此计划:
struct Val
{
Val() = default;
Val(Val&&) = default;
auto& operator=(Val&&);
};
/* PLACEHOLDER */
auto& Val::operator=(Val&&) { return *this; }
Run Code Online (Sandbox Code Playgroud)
/* PLACEHOLDER */用...... 代替
int main()
{
std::vector<std::pair<int, Val>> v;
v.emplace(std::begin(v), 0, Val{});
}
Run Code Online (Sandbox Code Playgroud)
...成功编译:
g ++ 7.0.1(主干)
clang ++ 3.9.1
/* PLACEHOLDER */用...... 代替
template <typename TVec>
void a(TVec& v)
{
v.emplace(std::begin(v), 0, Val{});
}
int main()
{
std::vector<std::pair<int, Val>> v;
a(v);
}
Run Code Online (Sandbox Code Playgroud)
...成功编译:
在 GCC C++20 概念库中,它有
template<typename _Derived, typename _Base>
concept derived_from = __is_base_of(_Base, _Derived)
&& is_convertible_v<const volatile _Derived*, const volatile _Base*>;
Run Code Online (Sandbox Code Playgroud)
__is_base_of(_Base, _Derived)不够?const volatile测试中需要用到什么?if(player!=NULL)
player->shuffled();
Run Code Online (Sandbox Code Playgroud)
我这样做是为了避免将null引用传递给字符串构造函数,但是在编译时仍然会出错.
我在我的Windows系统上安装了http://sourceforge.net/projects/clangonwin/.我的问题是:
所以我一直在使用从std :: vector派生的容器.也许这是一个糟糕的设计决定,原因有几个,而且你是否应该做这样的事情的问题在这里有广泛的讨论:
我确信我已经错过了一些讨论......但是在链接中找到了两个观点的合理论据.据我所知,"因为~vector()是非虚拟的"是你不应该从stl容器继承的"规则"的基础.但是,如果我在g ++ 4.9.2中查看std :: vector的实现,我发现std :: vector继承自_Vector_base,而_Vector_base是非虚拟析构函数.
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc>
{
...
~vector() _GLIBCXX_NOEXCEPT
{ std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
_M_get_Tp_allocator()); }
...
}
Run Code Online (Sandbox Code Playgroud)
哪里:
template<typename _Tp, typename _Alloc>
struct _Vector_base
{
...
~_Vector_base() _GLIBCXX_NOEXCEPT
{ _M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage
- this->_M_impl._M_start); }
...
}
Run Code Online (Sandbox Code Playgroud)
所以std :: vector的gcc 4.9.2实现继承自带有非虚析构函数的基类.这让我相信这是一种可接受的做法.为什么这样好?这种做法没有危险的具体条件是什么?
I've come across this behavior of std::gcd that I found unexpected:
#include <iostream>
#include <numeric>
int main()
{
int a = -120;
unsigned b = 10;
//both a and b are representable in type C
using C = std::common_type<decltype(a), decltype(b)>::type;
C ca = std::abs(a);
C cb = b;
std::cout << a << ' ' << ca << '\n';
std::cout << b << ' ' << cb << '\n';
//first one should equal second one, but doesn't
std::cout << std::gcd(a, b) …Run Code Online (Sandbox Code Playgroud)