在复制和交换习语的漂亮答案中,有一段代码我需要一些帮助:
class dumb_array
{
public:
// ...
friend void swap(dumb_array& first, dumb_array& second) // nothrow
{
using std::swap;
swap(first.mSize, second.mSize);
swap(first.mArray, second.mArray);
}
// ...
};
Run Code Online (Sandbox Code Playgroud)
他补充说明
还有其他声称我们应该专门为我们的类型使用std :: swap,提供一个类内交换以及一个自由函数交换等等.但这都是不必要的:任何正确使用swap都将通过一个不合格的调用,我们的功能将通过ADL找到.一个功能就可以了.
随着friend我对"不友好"的条款一点,我必须承认.所以,我的主要问题是:
swap静态的?它显然不使用任何成员变量.friend进来?副题:
swaps的noexcept?friend iter begin()和friend iter end()在类中以同样的方式?我觉得friend这里不需要,对吗?在Java类中,可以定义一个方法final,以标记此方法可能不会被覆盖:
public class Thingy {
public Thingy() { ... }
public int operationA() {...}
/** this method does @return That and is final. */
public final int getThat() { ...}
}
Run Code Online (Sandbox Code Playgroud)
这很清楚,它可能有助于防止意外覆盖,或者表现 - 但这不是我的问题.
我的问题是:从OOP的角度来看,我理解通过定义一个方法final,类设计者承诺这个方法将始终如所描述或隐含的那样工作.但是,这通常可能超出了班级作者的影响,如果该方法所做的事情比传递财产更复杂.
句法约束对我来说很清楚,但OOP意义上的含义是什么?final大多数班级作者在这个意义上是否正确使用?
final方法承诺什么样的"合同" ?
函数应该返回RValue Reference是否有原因?技巧,技巧,或成语或模式?
MyClass&& func( ... );
Run Code Online (Sandbox Code Playgroud)
我知道一般返回引用的危险,但有时我们会这样做,不管我们(T& T::operator=(T)只是一个惯用的例子).但是怎么样T&& func(...)?我们会从中获得这样的一般场所吗?与仅仅客户端代码相比,当编写库或API代码时,可能会有所不同?
我在这里找到了*C++结构化绑定的原始提议.它提出了一种轻松绑定多个返回值的方法,即:
auto {a, b} = minmax(data);
Run Code Online (Sandbox Code Playgroud)
但现在我看到每个人都指向C++ 17/C++ 1z提议语法
auto [a, b] = minmax(data);
Run Code Online (Sandbox Code Playgroud)
既然我已经学会了"列表被编写{like,this}",那么会出现一个新的列表语法?为什么?花括号有什么问题?
目前,使用g ++ - 4.8.1,您必须通过C++ 11模式编译文件
g++ -std=c++11 -o prog.x prog.cpp
Run Code Online (Sandbox Code Playgroud)
我可以说,是否有计划?
g++ -o prog.x prog.cpp
Run Code Online (Sandbox Code Playgroud)
编译prog.cpp?
也许prog.cpp有
#include <regex>thread_localclass Widget { int member = 5; }MyType operator"" myt(const char*, sze_t);几年前我被教过,在嵌入式系统或(非Linux-)内核开发C++等实时应用程序中, 例外是不可取的.(也许那个教训来自gcc-2.95之前).但我也知道,异常处理变得更好.
那么,C++是否 -在实践中实时应用程序的上下文中的异常
更新:异常处理是否真的需要 启用RTTI(正如一位回答者建议的那样)?是否涉及动态演员表或类似情节?
我刚刚注意到新标准的定义min(a,b)和max(a,b) 不 定义constexpr.
例25.4.7,[alg.min.max]:
template<class T> const T& min(const T& a, const T& b);
template<class T> T min(initializer_list<T> t);
Run Code Online (Sandbox Code Playgroud)
这不是很可惜吗?我本来想写的
char data[ max(sizeof(A),sizeof(B)) ];
Run Code Online (Sandbox Code Playgroud)
代替
char data[ sizeof(A) > sizeof(B) ? sizeof(A) : sizeof(B) ];
char data[ MAX(sizeof(A),sizeof(B)) ]; // using a macro
Run Code Online (Sandbox Code Playgroud)
那些不可能的constexpr原因是什么?
在N3059中,我找到了对(和元组)的分段构造的描述(它在新标准中).
但是我不知道什么时候应该使用它.我发现了关于emplace和不可复制实体的讨论,但是当我尝试它时,我无法创建一个我需要 piecewiese_construct或可以看到性能优势的案例.
例.我以为我需要一个不可复制的类,但是movebale(转发需要):
struct NoCopy {
NoCopy(int, int) {};
NoCopy(const NoCopy&) = delete; // no copy
NoCopy& operator=(const NoCopy&) = delete; // no assign
NoCopy(NoCopy&&) {}; // please move
NoCopy& operator=(NoCopy&&) {}; // please move-assign
};
Run Code Online (Sandbox Code Playgroud)
然后,我想到标准对构造会失败:
pair<NoCopy,NoCopy> x{ NoCopy{1,2}, NoCopy{2,3} }; // fine!
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.实际上,这是我所期望的,因为"移动东西"而不是在stdlib中的任何地方复制它应该是.
因此,我认为我没有理由这样做,或者说:
pair<NoCopy,NoCopy> y(
piecewise_construct,
forward_as_tuple(1,2),
forward_as_tuple(2,3)
); // also fine
Run Code Online (Sandbox Code Playgroud)
piecewise_construct?Gnu C++编译器似乎定义__cplusplus为1
#include <iostream>
int main() {
std::cout << __cplusplus << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这1在标准c ++模式下以gcc 打印,在C++ 0x模式下打印,使用gcc 4.3.4和gcc 4.7.0.
C++ 11 FDIS在"16.8预定义宏名[cpp.predefined]"中说
编译C++转换单元时,名称
__cplusplus定义为值201103L.(脚注:本标准的未来版本将以更大的值替换此宏的值.不合格的编译器应使用最多五位小数的值.)
旧的std C++ 03也有类似的规则.
GCC是否将此设置为1,因为它"不符合"?
通过阅读该列表,我认为__cplusplus如果我有一个支持C++ 11的编译器,我可以使用以便携方式检查.但是使用g ++这似乎不起作用.我知道...EXPERIMENTAL...宏,但很好奇为什么g ++以__cplusplus这种方式定义.
我最初的问题是在不同的空指针变体之间切换.像这样的东西:
#if __cplusplus > 201100L
# define MYNULL nullptr
#else
# define MYNULL NULL
#endif
Run Code Online (Sandbox Code Playgroud)
是否有一种简单且合理的便携式方式来实现这样的开关?
我有一个带有varargs模板参数的模板函数,就像这样
template<typename Args...>
void ascendingPrint(Args... args) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
我想写
template<typename Args...>
void descendingPrint(Args... args) {
/* implementation using ascendingPrint()? */
}
Run Code Online (Sandbox Code Playgroud)
如何在传递参数包之前反转参数包 的顺序args,即在伪代码中:
template<typename Args...>
void descendingPrint(Args... args) {
ascendingPrint( reverse(args) );
}
Run Code Online (Sandbox Code Playgroud)