C++ 11正则表达式是否有完整/正确的实现(现在)?
关于编译器支持与库支持的注意事项:
编译器支持 =编译器识别添加到相关功能的语言的任何新语法.使用添加到程序中的新功能的代码将编译.
Library Support =库已更新以实际实现该功能.添加到您的程序并链接到库的代码将起作用.
*编辑:我已使用新信息更新了此摘要,并将其移至下面的答案中.
当您为用户定义的类型定义前缀operator ++并且您没有提供后缀版本时,编译器(至少在Visual C++中)将在您的代码调用缺少的POSTFIX版本时使用PREFIX版本.
至少它会给你一个警告.但是,我的问题是:为什么它只是给你一个未定义的成员函数的错误?
我亲眼看过这个,并且在另一篇文章和其他地方看过它,但我在实际的C++标准中找不到这个.我的第二个和第三个问题是......它是否符合标准?这是微软特有的处理情况吗?
即使知道由于以下剪辑而发生的事情,理解它是如何发生也会有所帮助.接下来是四个问题
鉴于:
int& foo()
{
int i = 1;
return i;
}
Run Code Online (Sandbox Code Playgroud)
并且知道在下面对名为i的本地的引用被解除引用到分配给intVal的temp并且本地i在foo()的末尾消失
int intVal = foo();
Run Code Online (Sandbox Code Playgroud)
第一个问题 - 在下面,表达式的右侧与上面相同,所以这是编译器看到左侧并且基于上下文知道不取消引用返回的引用的情况,而是用它初始化创建一个新的引用?
第二个问题 - 只有这一点使得本地i坚持在intRef在范围内?
int& intRef = foo();
Run Code Online (Sandbox Code Playgroud)
第三个问题 - bellow intPtr获取本地i的地址.那么,编译器是否使用赋值的上下文并决定不取消引用以在获取引用的地址之前获取值(而不是说获取包含去引用值的temp的地址)?
第四个问题 - 当intPtr在范围内时,本地i会不停?
int* intPtr = &foo();
Run Code Online (Sandbox Code Playgroud) C++ 11编译器(以及他们)是否注意到一个函数是constexpr并且即使它们未被声明为constexpr也会将它们视为这样?
我正在使用维基百科中的示例向使用constexpr的人展示:
int get_five() {return 5;}
int some_value[get_five() + 7]; // Create an array of 12 integers. Ill-formed C++
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是编译器没问题.所以,我进一步更改了get_five()以获取一些int参数,将它们相乘并返回结果,同时仍未明确声明为constexpr.编译器也可以.似乎如果编译器可以做到这一点,那么为了明确声明constexpr的某些东西,没有太多的意义.
我想知道是否有一种安全的编程实践可以提醒编码人员在发生这种微妙的行为时,或者更好的是,首先要避免它.
的用户struct A可能不知道有没有转移构造.在他们试图调用缺席的ctor时,他们既没有得到编译器警告,也没有得到复制ctor被调用的任何运行时指示.
下面的答案解释了发生的转换,但我认为这不是一个好事.如果缺少使用const引用作为参数的构造函数,则会出现编译时错误,而不仅仅是解析为非const引用版本.那么,为什么在类中没有实现移动语义时,尝试使用移动语义会导致编译时错误?
有没有办法通过一些编译时选项来避免这种行为,或者至少是一种在运行时检测它的方法?
如果他们在预料到这个问题,那么他们可以assert(source is null)在搬家之后,但这对许多问题都是如此.
示例,时间:
struct A {
A() {...}
A(A &a) {...}
A(A const & A) {...}
};
Run Code Online (Sandbox Code Playgroud)
构造如下:
A a1;
A a2 = std::move(a1); //calls const copy (but how would I know?)
Run Code Online (Sandbox Code Playgroud)
这导致调用复制ctor的const版本.现在两个对象可能有一个指向单个资源的指针,而其中一个可能很快就会调用它的析构函数.
我知道 VLA 不是 C++11 的一部分,我已经看到 GCC 的这个失误。这是我转向 Clang 的部分原因。但现在我也看到了 Clang。我正在使用 clang 3.2(落后于最新版本)并且我正在使用-pedantic 和 -std=c++11 进行编译
我希望我的测试不会编译但它编译和运行。
int myArray[ func_returning_random_int_definitely_not_constexpr( ) ];
Run Code Online (Sandbox Code Playgroud)
这是编译器错误还是我遗漏了什么?
回应这里的评论是 random_int_function()
#include <random>
int random_int_function(int i)
{
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(1,100);
int random_int = distribution(generator);
return i + random_int;
}
Run Code Online (Sandbox Code Playgroud) 我似乎记得在将多个名称空间合并为一个的方法中的某处.
现在,寻找所说的笔记我找不到它们 - 甚至使用搜索术语进行搜索,分组,合并和包装我都没有想出任何东西.也许我误解了之前看到过的东西. 我没有具体的应用程序,这只是一种好奇心而且有点做作.
但是,从两个名称空间开始......
namespace a {int func() {return 1;}}
namespace b {int func() {return 2;}}
Run Code Online (Sandbox Code Playgroud)
我正在寻找语法,或者简单地用另一个名字包装它们 - 事实之后 - (是的,我知道我可以用嵌套的方式重写它)或者将它们合并到一个新的空间中.但是,我确实发现如果我添加到其中一个名称空间有用的话.
namespace c {namespace a{ int func2() {return 3;}} }
int main(int argc, char **argv)
{
int a = a::func(); // normal case
int c = c::a::func2(); // wrapped and added to
//int c = c::func2(); // doesn't work
//int d = a::func2(); // doesn't work
}
Run Code Online (Sandbox Code Playgroud)
问题是:
1)是否有将两个空格合并为一个新空格的语法?
2)是否有一种语法来包装空格而不向子空间添加更多内容?
鉴于:
int& foo(); // don't care what the reference is to
int intVal;
Run Code Online (Sandbox Code Playgroud)
在以下两种情况下,右侧是相同的函数调用
int& intRef = foo();
intVal = foo(); // a reference is returned... a value is assigned.
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,返回的引用如何"转换"为值?
它是由int的赋值运算符完成的吗?
这些成员函数是否像它们看似无用而存在只是为了提供与其他容器的一致性?
例如:
std::array<int, 4> array1; // size of 4 (but no elements initialized)
std::array<int, 0> array2; // size of zero.
array1.empty(); // false - not empty even though no elements are initialized
array2.empty(); // true - empty and no way to add elements
array1.size(); // room for four now
array1.max_size(); // room for four forever
array2.size(); // no room for anything now
array2.max_size(); // ... or ever
Run Code Online (Sandbox Code Playgroud)
这个问题的答案是处理零"大小"参数和来自sizeof()的非零返回,即,即使在空的情况下也会占用空间.但那不是我要问的.
对于空容器,std :: all_of()和std:none_of()都返回true.
除了辩论这个概念方面,有人可以提出一个成语,不要求总是检查容器是否为空并检查all_of或none_of?
这很麻烦,因为在空容器上的两个算法中使用相同的谓词将表明谓词对于ALL和NONE都是正确的.所以,你的(空)向量是all_of"odd",all_of"even",none_of"odd"和none_of"even".
在更实际的层面上,我正在考虑检查状态的项目集合,就像任何"准备好处理"一样,并期望空集合对应于"否,没有准备好处理的元素".我知道我可以检查它是否是空的,但我正在寻找其他可能性.
下面的代码向函数传递modify_entry一个指向类型对象的指针,Entry并在函数体内部unique_ptr采用原始指针.但是,指针指向的对象似乎在函数返回后仍然存在.
当我编译这段代码
#include <iostream>
#include <memory>
struct Entry {
Entry(std::string name) : name_(name) { std::cout << "Constructor for " + name_ + '\n'; }
~Entry() { std::cout << "Destructor for " + name_ + '\n'; }
std::string name_;
};
void modify_entry(Entry* e_ptr){
std::cout << "Inside modify_entry()\n";
std::unique_ptr<Entry>{e_ptr}->name_ += " Doe";
}
int main(int argc, const char * argv[])
{
Entry* entry_ptr = new Entry("John");
modify_entry(entry_ptr);
std::cout << "Back from modify_entry()\n";
std::cout << entry_ptr->name_ << …Run Code Online (Sandbox Code Playgroud)