草庐IT

标准ACL

全部标签

C++标准歧义

据我在标准中所见,以下代码是有效的。它在MSVC1025中编译。conststructomg;structomgvolatile;intmain(){return0;}限定符const和volatile在这些声明中似乎毫无意义。它们既不会帮助也不会伤害编译器和程序员。该标准似乎并不打算消除这些“空洞的歧义”。在空声明;的情况下,它是明确允许的。是否还有其他标记在预处理后与表达式的含义无关的情况? 最佳答案 两者都是clang和gcc使用-pedantic-errors拒绝此代码。clang提供以下错误:error:'const'is

c++ - C++ 标准中哪里说::delete 可以更改左值?

我遇到了我的第一个编译器,它更改了传递给::delete的左值,但没有将左值清零。以下是正确的:Foo*p=newFoo();Foo*q=p;assert(p!=0);assert(p==q);::deletep;assert(p!=q);assert(p!=0);请注意,删除操作后p不为零,它已从旧值改变。一位同事告诉我,根据他使用一些大型机C++编译器将p更改为0xFFFFFFFF以及将p更改为0的其他编译器的经验,这并不罕见。在C++标准中哪里说允许编译器这样做?通过StackOverflow搜索,我发现了这个问题:Whydoesn’tdeletesetthepointertoN

c++ - 是否有标准名称(模板或宏)来替换 ARRAY_SIZE、_countof 等?

我不是在谈论std::array或任何东西,只是经典的VanillaC/C++数组。我知道可以实现ARRAY_SIZE/_countof的各种方式,我只是想知道他们是否已经设法为此标准化了一个名称(在std::我假设)。如果没有,是否有相关建议? 最佳答案 当前的解决方法std::extent-数组的大小如果您正在使用native数组,您可以使用std::extent来自,用于生成数组的Nth维(默认为第一个)中的元素数。inta1[1024];inta2[std::extent::value];//int[1024]一点间接(通用

c++ - 在标准 (C++14) 的哪个地方说以下两个声明是等价的?

structA{};intA;structAa;structA::Ab;上面的最后两个声明是等价的。它们都声明了类型A的对象。我可以在标准中的什么地方找到或推断出这一点? 最佳答案 [类]/2:Aclass-nameisinsertedintothescopeinwhichitisdeclaredimmediatelyaftertheclass-nameisseen.Theclass-nameisalsoinsertedintothescopeoftheclassitself;thisisknownastheinjected-cla

c++ - C++ 标准库必须支持对 friend 是谁挑剔的类吗?

这个问题最容易用一个例子来说明,所以这里是:像下面这样的代码是否保证有效,并且可以正确编译和运行?(并不是所有的实现都能正确地编译它,但我想知道这是否是一个错误。)#includeclassPicky{friendPicky*std::copy(Pickyconst*,Pickyconst*,Picky*);Picky&operator=(Pickyconst&){return*this;}public:Picky(){}};intmain(){Pickyconsta;Pickyb;std::copy(&a,&a+1,&b);return0;} 最佳答案

c++ - 固定宽度整数类型是否保证是标准内置类型的 typedef?

是来自的类型(例如int16_t、uint_fast64_t、int_least8_t)保证为typedefs表示其中一种内置类型,例如short,unsignedlong等等?或者是否允许实现使用非通常内置类型的类型来实现固定宽度类型? 最佳答案 不,至少对于类型intN_t不是。这些类型保证具有二进制补码表示(根据C997.18.1.1,C++11和C++14引用)。标准整数类型不必是二进制补码。C11相对于C99也有重要的变化(实际上只是bugfix),强调上面的一点:7.20.1.1/3:However,ifanimplem

c++ - 以符合标准的方式使用与数组相同类型的成员重新解释结构

这个问题在这里已经有了答案:Castingdoublearraytoastructofdoubles(6个答案)关闭5年前。在各种3d数学代码库中,我有时会遇到这样的事情:structvec{floatx,y,z;float&operator[](std::size_ti){assert(iAFAIK是非法的,因为允许实现在成员之间虚假地添加填充,即使它们属于同一类型,但实际上没有人会这样做。这可以通过static_assert施加约束来合法化吗?static_assert(sizeof(vec)==sizeof(float)*3);即static_assert未被触发是否意味着ope

c++ - 如何减小C++标准库libstdc++.so文件大小

我的电脑上有不同的C++编译器,每个编译器都有自己的libstdc++.so并且它们的大小不同。-rwxr-xr-x.1rootroot967KMar222017libstdc++.so.6.0.13-rwxr-xr-x.1rootroot6.5MAug12017libstdc++.so.6.0.20-rwxr-xr-x.1rootroot11MAug12017libstdc++.so.6.0.21-rwxr-xr-x.1rootroot12MJan3016:58libstdc++.so.6.0.24我想知道为什么libstdc++.so.6.0.13比其他的小很多,有什么办法可以减少

c++ - 为什么 C++ 标准指定在具有混合符号的二进制运算中将有符号整数转换为无符号?

C和C++标准规定,同阶的有符号整数和无符号整数之间的二元运算,有符号整数被强制转换为无符号整数。由此引起的SO有很多问题......我们称之为奇怪的行为:unsignedtosignedconversion,C++ImplicitConversion(Signed+Unsigned),Awarning-comparisonbetweensignedandunsignedintegerexpressions,%(mod)withmixedsignedness等但是这些都没有给出任何理由说明为什么标准采用这种方式,而不是强制转换为带符号的整数。我确实找到了一位自称为大师的人,他说这是显而

c++ - 检查标准输入是否为空

我搜索了但没有得到这个问题的相关答案,我在linux机器上工作,我想检查标准输入流是否包含任何字符,而不从流中删除字符。 最佳答案 您可能想尝试select()函数,并等待数据进入输入流。描述:select()andpselect()allowaprogramtomonitormultiplefiledescriptors,waitinguntiloneormoreofthefiledescriptorsbecome"ready"forsomeclassofI/Ooperation(e.g.,inputpossible).Afile