ISO C标准(ISO/IEC 9899)和ISO C++标准(ISO/IEC 14882)不在线发布; 相反,必须为每个标准购买PDF.我想知道这背后的理由是什么......对于C和C++编程语言来说,这些语言的权威规范是不是免费提供并且可以在线搜索,这对它没有害处吗?这是否鼓励使用可能不准确,非权威的来源获取有关这些语言的信息?
虽然我知道在开发C和C++标准方面付出了很多时间和精力,但我仍然对为规范收费的选择感到有些困惑.该OpenGroup的基本规范,例如,可在网上免费; 他们通过收取认证来赚钱.有谁知道为什么ISO标准委员会不会在证明标准合规性方面获得收入,而不是为这些文件收费?另外,有没有人知道ISO标准委员会看起来非常糟糕的网站是否有意这样看?就好像他们不希望人们访问和购买规范一样.
最后一件事...... C和C++标准通常被描述为"开放标准"......虽然我意识到这意味着任何人都被允许实施标准,是否应该修改"开放"的定义?为标准收费而不是公开提供似乎与开放精神相反.
PS我有ISO/IEC 9899:1999和ISO/IEC 14882:2003的副本,所以请不要谈论便宜或任何东西......虽然如果你想说这些东西,你可能想要考虑高中,本科生和研究生可能没有那么多额外的现金.此外,你可能想要考虑一个事实,即ISO网站真的很粗略,他们甚至不会告诉你成本,直到你进行结账...真的不鼓励人们去拿一份,现在做它?
编辑/评论
我认为,如果ISO标准委员会要从认证中获得收入,那么它会激励更小但更频繁地改变标准,而不是非常大的修订.它还会激励创建一个可实施的标准(我怀疑ISO C++委员会如果从认证中获得收入,就会首先引入"出口").
我找到了解决一个没有PDF在线的烦恼的解决方案....我已将我的标准副本上传到我的Google Docs中,这样我仍然可以从任何计算机访问它而无需携带它.
我正在设置一些预处理器的东西,我想要一个更准确的数字,因为__cplusplusC++ 14应该被定义为.是否有一个标准强制要求?
如果我想std::vector用SSE 处理数据,我需要16字节对齐.我怎样才能做到这一点?我需要编写自己的分配器吗?或者默认分配器是否已经与16字节边界对齐?
请考虑以下代码段:
struct Base { };
struct Derived : Base { };
void f(Base &) { std::cout << "f(Base&)\n"; }
template <class T = int>
void g() {
Derived d;
f(T{} ? d : d); // 1
}
void f(Derived &) { std::cout << "f(Derived&)\n"; }
int main() {
g();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我认为应该在第一阶段查找对fat 的函数调用// 1,因为它的参数的类型是明确的Derived&,因此可以解析为f(Base&)范围中唯一的一个.
Clang 3.8.0同意我的观点,但是GCC 6.1.0没有,并推迟f到第二阶段的查找,在那里f(Derived&)被选中.
哪个编译器是对的?
可能重复:
为什么使用迭代器而不是数组索引?
string::iterator it;
for (it = str.begin(); it < str.end(); it++)
cout << *it;
cout << endl;
Run Code Online (Sandbox Code Playgroud)
为什么不:
for (int i = 0; i < str.size(); i++)
cout << str[i];
cout << endl;
Run Code Online (Sandbox Code Playgroud)
似乎string :: iterator也没有提供范围检查.我们为什么要使用string::iterator而不是索引?
谢谢.
我写了以下代码片段:
void foo()
{
struct _bar_
{
int a;
} bar;
cout << "Value of a is " << bar.a;
}
Run Code Online (Sandbox Code Playgroud)
并用g ++ 4.2.1(Mac)编译它.输出为"a的值为0".
是否真的说c ++中的结构的数据成员默认是初始化的(与c相比)?或者观察到的结果是巧合吗?
我可以想象c ++中的结构有一个默认的构造函数(因为结构和类在c ++中几乎相同),这可以解释为什么bar的数据成员a初始化为零.
可能重复:
我在哪里可以找到当前的C或C++标准文档?
我在哪里可以在线阅读C99官方语言标准手册/参考/规范?
C1x已成为ISO/IEC 9899:2011又名C11.
有谁知道2011年4月草案n1570标准中有哪些变化(如果有的话)?
ETA:有从伦敦(2011年3月)的委员会会议记录(其中应包括在n1570)这里,从华盛顿特区(2011年10月)在这里 ; 我想DC分钟中接受的变化列表应涵盖的内容.
我听说这reinterpret_cast是实现定义,但我不知道这是什么意思.你能提供一个如何出错的例子,它出错了,使用C-Style演员会更好吗?
以下语法有效:
while (int i = get_data())
{
}
Run Code Online (Sandbox Code Playgroud)
但以下不是:
do
{
} while (int i = get_data());
Run Code Online (Sandbox Code Playgroud)
我们可以通过标准草案N4140第6.4节了解原因:
1 [...]
condition: expression attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list2条件规则既适用于选择陈述,也适用于
for和while陈述(6.5).[...]
和第6.5节
1迭代语句指定循环.
iteration-statement:while( condition ) statementdostatementwhile( expression ) ;
相反,你被迫做一些丑陋的事情:
int i = get_data();
do
{
} while ((i = get_data())); // double parentheses sic
Run Code Online (Sandbox Code Playgroud)
这是什么理由?