草庐IT

c++ - "int (x), 1;"是一个模棱两可的陈述吗?

voidf(intx){int(x),1;}Clang编译它,GCC没有。哪个编译器是正确的? 最佳答案 IMO,[stmt.ambig]中的措辞这一点很清楚:Anexpression-statementwithafunction-styleexplicittypeconversionasitsleftmostsubexpressioncanbeindistinguishablefromadeclarationwherethefirstdeclaratorstartswitha(.Inthosecasesthestatementis

c++ - 如何使用具有 pair<int,int> vector 元素的 unordered_set

我想拥有类似的东西unordered_set>>us;但即使没有配对:#include#includeusingnamespacestd;intmain(){unordered_set>um;}失败了:Infileincludedfrom/usr/include/c++/4.8/bits/hashtable.h:35:0,from/usr/include/c++/4.8/unordered_set:47,fromprog.cpp:2:/usr/include/c++/4.8/bits/hashtable_policy.h:Ininstantiationof‘structstd::__d

c++ - 如何使用具有 pair<int,int> vector 元素的 unordered_set

我想拥有类似的东西unordered_set>>us;但即使没有配对:#include#includeusingnamespacestd;intmain(){unordered_set>um;}失败了:Infileincludedfrom/usr/include/c++/4.8/bits/hashtable.h:35:0,from/usr/include/c++/4.8/unordered_set:47,fromprog.cpp:2:/usr/include/c++/4.8/bits/hashtable_policy.h:Ininstantiationof‘structstd::__d

c++ - 将 0 int 文字发送到 const 字符串参数时发生访问冲突

在VS2015和VS2017上,编译时没有警告,并生成无法捕获的访问冲突并使应用程序崩溃。显然int0被静默转换为空指针,然后假定它指向一个字符串,因此崩溃。#include#includevoidcrash(conststd::string&s){}intmain(){try{crash(0);}catch(conststd::exception&ex){//nevergetshere!std::cout如何捕获此类异常并从中恢复?如果我从函数参数中删除const它不会编译-所以这可能是防止用户滥用的一种方法,但我会失去const提供的保护,还是会?编写避免此问题的原型(protot

c++ - 将 0 int 文字发送到 const 字符串参数时发生访问冲突

在VS2015和VS2017上,编译时没有警告,并生成无法捕获的访问冲突并使应用程序崩溃。显然int0被静默转换为空指针,然后假定它指向一个字符串,因此崩溃。#include#includevoidcrash(conststd::string&s){}intmain(){try{crash(0);}catch(conststd::exception&ex){//nevergetshere!std::cout如何捕获此类异常并从中恢复?如果我从函数参数中删除const它不会编译-所以这可能是防止用户滥用的一种方法,但我会失去const提供的保护,还是会?编写避免此问题的原型(protot

c++ - 带有 const int* const 的 scanf 有效,但不应该

我的代码相当于以下内容:constint*constn=newint;printf("input:");scanf("%d",n);deleten;现在,由于n是一个指向CONSTANT整数的指针,这应该不起作用(我期待编译器错误)。但是,这似乎可以正常工作,甚至将输入的值存储到*n中。我想知道,为什么这不会给我一个错误;为什么它起作用?scanf不应该不能改变*n的值吗? 最佳答案 scanf的原型(prototype)是:intscanf(constchar*format,...);省略号表示它接受可变参数。C(和C++)没有办

c++ - 带有 const int* const 的 scanf 有效,但不应该

我的代码相当于以下内容:constint*constn=newint;printf("input:");scanf("%d",n);deleten;现在,由于n是一个指向CONSTANT整数的指针,这应该不起作用(我期待编译器错误)。但是,这似乎可以正常工作,甚至将输入的值存储到*n中。我想知道,为什么这不会给我一个错误;为什么它起作用?scanf不应该不能改变*n的值吗? 最佳答案 scanf的原型(prototype)是:intscanf(constchar*format,...);省略号表示它接受可变参数。C(和C++)没有办

c++ - 为什么 const int& 可以绑定(bind)到 int?

在C++入门中,我发现constint&可以与int对象绑定(bind)。我不明白,因为我认为constint&应该绑定(bind)constint不是int对象,int对象可以改变,这本书解释了这个问题,当constint&对象与int绑定(bind);两者之间有一个临时对象,例如:inta=0;constint&r=a;我们可以使用b作为临时值,所以上面等于:constintb=a;constint&r=b;但是我觉得这本书是不对的,因为如果在a和r之间存在一个像b这样的临时,那么值r不能改,但是我在visualstudio中调试下面的编码,发现不对:inta=0;constint

c++ - 为什么 const int& 可以绑定(bind)到 int?

在C++入门中,我发现constint&可以与int对象绑定(bind)。我不明白,因为我认为constint&应该绑定(bind)constint不是int对象,int对象可以改变,这本书解释了这个问题,当constint&对象与int绑定(bind);两者之间有一个临时对象,例如:inta=0;constint&r=a;我们可以使用b作为临时值,所以上面等于:constintb=a;constint&r=b;但是我觉得这本书是不对的,因为如果在a和r之间存在一个像b这样的临时,那么值r不能改,但是我在visualstudio中调试下面的编码,发现不对:inta=0;constint

c++ - int 类型的构造函数

考虑到成本,这些情况是否相同?//case1inta=5;//case2inta(5);//case3inta;a=5 最佳答案 这三种语法不同,请耐心等待我使用用户定义的类型而不是int,我稍后会回到int。Ta(5);//DirectinitializationTb=5;//Implicitconversion(5->tmp)+copy-initializationTc;c=5;//Defaultinitialization+assignment在第一种情况下,对象a是通过构造函数构造的,该构造函数采用int或可以从int.st