草庐IT

c++ - std::unordered_set<T>::insert(T&&): 如果存在则移动参数

这个问题是关于C++11标准库中几个函数的规范,这些函数将它们的参数作为右值引用,但并不在所有情况下都使用它们。一个例子是std::unordered_set::insert(T&&).很明显,这个方法将使用T的移动构造函数构造容器中的元素,如果它不存在的话。但是,如果元素已经存在于容器中会怎样?我很确定没有理由更改案例中的对象。但是,我没有在C++11标准中找到任何支持我的主张的内容。这里有一个例子来说明为什么这可能很有趣。以下代码从std::cin读取行并删除第一次出现的重复行。std::unordered_setseen;std::stringline;while(getline

c++ - std::unordered_set<T>::insert(T&&): 如果存在则移动参数

这个问题是关于C++11标准库中几个函数的规范,这些函数将它们的参数作为右值引用,但并不在所有情况下都使用它们。一个例子是std::unordered_set::insert(T&&).很明显,这个方法将使用T的移动构造函数构造容器中的元素,如果它不存在的话。但是,如果元素已经存在于容器中会怎样?我很确定没有理由更改案例中的对象。但是,我没有在C++11标准中找到任何支持我的主张的内容。这里有一个例子来说明为什么这可能很有趣。以下代码从std::cin读取行并删除第一次出现的重复行。std::unordered_setseen;std::stringline;while(getline

c++ - 三法则的异常(exception)?

我读过很多关于C++RuleofThree的文章.许多人对此发誓。但是当规定规则时,它几乎总是包含“通常”、“可能”或“可能”这样的词,表示存在异常(exception)情况。我还没有看到太多关于这些异常(exception)情况的讨论——三法则不成立的情况,或者至少坚持三法则没有任何优势的情况。我的问题是我的情况是否是三法则的合法异常(exception)。我相信在我下面描述的情况下,明确定义的复制构造函数和复制赋值运算符是必要的,但是默认(隐式生成)析构函数可以正常工作。这是我的情况:我有两个类,A和B。这里有问题的是A。B是A的friend。A包含B对象。B包含一个A指针,该指针

c++ - 三法则的异常(exception)?

我读过很多关于C++RuleofThree的文章.许多人对此发誓。但是当规定规则时,它几乎总是包含“通常”、“可能”或“可能”这样的词,表示存在异常(exception)情况。我还没有看到太多关于这些异常(exception)情况的讨论——三法则不成立的情况,或者至少坚持三法则没有任何优势的情况。我的问题是我的情况是否是三法则的合法异常(exception)。我相信在我下面描述的情况下,明确定义的复制构造函数和复制赋值运算符是必要的,但是默认(隐式生成)析构函数可以正常工作。这是我的情况:我有两个类,A和B。这里有问题的是A。B是A的friend。A包含B对象。B包含一个A指针,该指针

c++ - 如果函数在类范围内声明,则 constexpr 不起作用

我使用的是g++4.8.0,它不包含早期的constexpr错误。因此下面的代码工作fine:constexprintsize(){return5;}intarray[size()];intmain(){}但是,如果我将两个变量都包含在class中作为static,那么它会给出compilererror:structX{constexprstaticintsize(){return5;}staticconstintarray[size()];};intmain(){}这是错误:error:sizeofarray‘array’isnotanintegralconstant-express

c++ - 如果函数在类范围内声明,则 constexpr 不起作用

我使用的是g++4.8.0,它不包含早期的constexpr错误。因此下面的代码工作fine:constexprintsize(){return5;}intarray[size()];intmain(){}但是,如果我将两个变量都包含在class中作为static,那么它会给出compilererror:structX{constexprstaticintsize(){return5;}staticconstintarray[size()];};intmain(){}这是错误:error:sizeofarray‘array’isnotanintegralconstant-express

c++ - 如果不存在,则调用自由函数而不是方法

假设您有一系列类型无关的类通过返回值的给定方法实现一个通用概念:classA{public:intval()const{...}};classB{public:intval()const{...}};假设您需要一个通用的自由函数,该函数采用T为未实现val方法或调用val的任何类型返回常规值适用于所有类型的方法:templateintval_of(constT&t){return0;}templateintval_of(constT&t){returnt.val();}考虑到A和B只是示例:您不知道实现val将存在多少类型,以及不实现它会存在多少类型(因此显式特化不会扩展)。有没有一种

c++ - 如果不存在,则调用自由函数而不是方法

假设您有一系列类型无关的类通过返回值的给定方法实现一个通用概念:classA{public:intval()const{...}};classB{public:intval()const{...}};假设您需要一个通用的自由函数,该函数采用T为未实现val方法或调用val的任何类型返回常规值适用于所有类型的方法:templateintval_of(constT&t){return0;}templateintval_of(constT&t){returnt.val();}考虑到A和B只是示例:您不知道实现val将存在多少类型,以及不实现它会存在多少类型(因此显式特化不会扩展)。有没有一种

c++ - 如果语句包含宏,则 clang 无法替换语句

我正在使用clang尝试解析(使用C++API)一些C++文件,并使所有大小写-断点对使用特定样式。示例:**Original**switch(...){case1:{}break;case2:{break;}}**Afterreplacement**switch(...){case1:{break;}case2:{break;}}如果代码部分不包含任何宏,我目前所拥有的正是我想要的。我的问题是:clang是否以不同的方式处理扩展(如果我转储有问题的语句,它将显示扩展版本)宏?如果是这样,我怎样才能让它工作?可能有帮助的其他信息:我正在使用Rewriter::ReplaceStmt用新

c++ - 如果语句包含宏,则 clang 无法替换语句

我正在使用clang尝试解析(使用C++API)一些C++文件,并使所有大小写-断点对使用特定样式。示例:**Original**switch(...){case1:{}break;case2:{break;}}**Afterreplacement**switch(...){case1:{break;}case2:{break;}}如果代码部分不包含任何宏,我目前所拥有的正是我想要的。我的问题是:clang是否以不同的方式处理扩展(如果我转储有问题的语句,它将显示扩展版本)宏?如果是这样,我怎样才能让它工作?可能有帮助的其他信息:我正在使用Rewriter::ReplaceStmt用新