对于Scala的严格类型系统的粉丝,但是C++的粉丝:
void*,不投入很多,拳击简单值类型即struct Month {int value;};).我还记得,大约一般属性并最终导致新的上下文关键字的讨论中override,并final有人提出,这些矿石是编译器的支持有些可能是可选的(我想这将在标准文本阅读"的行为是实现特定的)但是我在FDIS中找不到关于这种可选性的任何痕迹以及之后的更正.
但是,因为没有找到它不是证明,我要问:是否支持在2.11p2,9.2和FDIS的10.3描述了override和final一个符合标准的编译必须的吗?
例如,是否要求符合标准的编译器拒绝
class Foo {
void func() override; // Error: not virtual, 9.2p9
};
Run Code Online (Sandbox Code Playgroud)
或者它是否仍然遵循忽略覆盖?
我在我应该修复的程序中发现了一个函数,该mod函数定义了一个函数:
int mod(int a, int b)
{
int i = a%b;
if(i<0) i+=b;
return i;
}
Run Code Online (Sandbox Code Playgroud)
有人告诉我,a并b会一直在路上...阳性
嗯?if(i<0)?
论点是,那
模运算的结果是一个等价类,可以选择该类的任何成员作为代表
并且只是作为事后的想法
...; 然而,通常的代表是最小的正余数,属于该类的最小非负整数,即欧几里德除法的余数。然而,其他约定也是可能的。
这意味着6 % 7可以返回6(到目前为止很好),但也可以返回-1. 嗯……真的吗?(让我们忽略所呈现的实现无法处理所有情况的事实。)
我知道模运算就是这样在数学上是正确的。但是后来有人告诉我,C%实际上“没有实现模运算符,而是实现了余数”。
那么,C 是如何定义%运算符的呢?
在 C-Draft 我只找到
/ 运算符的结果是第一个操作数除以第二个操作数的商;% 运算符的结果是余数。在这两个操作中,如果第二个操作数的值为零,则行为未定义。
这是否意味着,6 % 7总是这样6?或者也可以-1?
可能重复:
这个"数组大小"模板函数如何工作?
NARR在C++(C++ 0x)中没有宏可以实现吗?
const static pair<string,int> data[] = {
{"Montag",1}, {"Dienstag",2}, {"Mittwoch",3}, {"Donnerstag",4},
{"Freitag",5}, {"Samstag",6}, {"Sonntag",7}
};
#define NARR(A) (sizeof(A)/sizeof(*A))
const static map<string,int> german_weekdays(data, data+NARR(data));
Run Code Online (Sandbox Code Playgroud)
一个简单的函数是不可能的,因为那时[]失去了它的大小信息,变成了另一个诗人:
size_t narr(sometype arr[]) { /* won't work */ }
Run Code Online (Sandbox Code Playgroud)
模板?超载?魔法?
我在一次演讲中听说C++ 0x 关联容器中的键不再可变.之前,在C++ 03中,它们是可变的,并且只有标准的文本说,顺序或键必须保持不变.
现在,幸运的是,这是非法的:
std::set<int> ss { 2,5,1,6,8,5,8,0,2,4,9 };
auto it = ss.find(4);
*it = 7; // 'ERROR: assignment of read-only location'
Run Code Online (Sandbox Code Playgroud)
这个变化在C++ 0x中反映在哪里?我看了最终选秀,但仍然看到了find()这样的回报iterator- 听起来可以修改.(为什么这是,而且必须是我猜测:容器就像map想要允许修改的值.修改了什么才能使关键部分const?)
在标准文本中,8.5.4(3)列表初始化[dcl.init.list]中有一个例子
struct S {
S(std::initializer_list<double>); // #1
S(const std::string&); // #2
};
const S& r1 = { 1, 2, 3.0 }; // OK: invoke #1
const S& r2 { "Spinach" }; // OK: invoke #2 !!!
Run Code Online (Sandbox Code Playgroud)
(示例是关于ref-to-temp,但我在这里指的是重载决策).
Scott Meyers在他的演讲/幻灯片中讲述了一个不同的故事:
std :: initializer_list参数始终优先于其他类型:
class Widget {
public:
Widget(double value, double uncertainty); // #1
Widget(std::initializer_list<std::string> values); // #2
};
double d1, d2;
Widget w1 { d1, d2 }; // tries to call #2; fails because
// no double ? string …Run Code Online (Sandbox Code Playgroud) 我想停止警告
server.cpp:823:警告:从'void*(ClientHandler :: )()'转换为'void()(void)'
在通话中:
pthread_create(th, NULL,
(void* (*)(void*)) &ClientHandler::handle,
(void *) clientHandler);
Run Code Online (Sandbox Code Playgroud)
其中handle()是成员函数ClientHandler:
void* ClientHandler::handle();
Run Code Online (Sandbox Code Playgroud)
我很难从编译器中解密函数类型的消息.
问题是:
handle()界面吗?我可以摆脱整体铸造吗?难道我的理解是,新标准的权利shared_ptr并不需要使用引用计数?只有它可能以这种方式实现?
我可以想象一个以某种方式使用隐藏链表的实现.在N3291"20.7.2.2.5.(8)shared_ptr观察者[util.smartptr.shared.obs]"
[注意:use_count()不一定有效. - 结束说明]
这给了我这个想法.
我已经打了很多新的统一初始化用{}.像这样:
vector<int> x = {1,2,3,4};
map<int,string> getMap() {
return { {1,"hello"}, {2,"you"} };
}
Run Code Online (Sandbox Code Playgroud)
毫无疑问,这种初始化可能会改变我们的程序C++.但是我想知道在Herb Sutter常见问题解答中阅读Alfonses的问题时我是否错过了一些神奇的可能性.
Alfonse:统一初始化(在推导构造的类型时使用{}调用构造函数)有可能从根本上减少创建C++类型所需的键入数量.就像lambdas一样,它会改变人们编写C++代码的方式.[...]
有人能给我一个Alfonse在这里设想的例子吗?
initialization initializer-list uniform-initialization c++11
我注意到在许多源代码文件中,人们可以看到cout在cin 没有显式刷新的情况下在写入之前写入:
#include <iostream>
using std::cin; using std::cout;
int main() {
int a, b;
cout << "Please enter a number: ";
cin >> a;
cout << "Another nomber: ";
cin >> b;
}
Run Code Online (Sandbox Code Playgroud)
执行此操作时,用户输入的42[Enter]73[Enter]内容很好(g ++ 4.6,Ubuntu):
Please enter a number: 42
Another number: 73
Run Code Online (Sandbox Code Playgroud)
这是定义的行为,即标准是否说cout在cin读取之前以某种方式刷新了?我可以在所有符合要求的系统上预期这种行为吗?
或者应该在这些消息后明确说明cout << flush?
c++11 ×7
c++ ×5
c ×2
containers ×1
division ×1
flush ×1
iostream ×1
iterator ×1
meta ×1
modulo ×1
overloading ×1
overriding ×1
pthreads ×1
scala ×1
shared-ptr ×1
sizeof ×1
stl ×1
stream ×1
type-safety ×1
virtual ×1