language-lawyer相关内容
简而言之 主流class-based OO languages不允许对象的类在创建后更改。我在UML中假定了同样的约束,尤其是基于UML2.5规范中的以下条款: 7.5.1:在声明包含值的元素时使用类型和重数,以约束可能包含的值的种类和数量。 9.2.3.2:分类器的实例也是其每个泛化的(间接)实例。 然而,在this answer的评论中,几位技术高超的UML专家对这一假设提
..
考虑简单代码: #include struct A { operator double(){ std::cout
..
UML 2.5.1规范没有很好地定义关键字subsets。我在6.4.2节中找到了以下内容: 约束{subsets Enda}表示应用此约束的关联端将关联端Enda子集。 请考虑下图: 直观地说,我认为这意味着: 一个人可以是零个或多个俱乐部的成员。 一个人最多只能做一个俱乐部的领导。 如果某人是某个俱乐部的领导人,则他/她也是该俱乐部的成员。 如果某人是某个俱乐部的
..
此处的用法与Using read() directly into a C++ std:vector相同,但有重新分配的帐户。 输入文件的大小未知,因此当文件大小超过缓冲区大小时,会通过加倍大小来重新分配缓冲区。以下是我的代码: #include #include #include int main() { const
..
struct A{ operator auto(){ return 0; } }; int main(){ A a; a.operator auto(); // #1 a.operator int(); // #2 } GCC接受#2是显式调用转换函数的正确方式,而Clang接受#1。 由于以下规则,#1似乎格式错误: dcl.spec.auto#
..
该标准定义了几个“在此之前发生”关系,这些关系将良好的旧“在此之前排序”扩展到多个线程: [intro.races] 11评估A仅发生在评估B之前,如果出现以下情况 (11.1)-A排在B之前,或 (11.2)-A与B同步,或 (11.3)-A在X之前,X在B之前。 [注10:在没有使用操作的情况下,在关系相同之前和简单地在关系相同之前发生。-结束语] 12评估A
..
灵感来自this question。 我们知道具有非constexpr初始值设定项的全局变量会经历两种不同的";初始化: 首先,静电初始化&q;,这将对它们进行零初始化。 第二,";动态初始化";,它使用用户提供的初始值设定项。 哪些初始化启动了变量LIFEST?[basic.life]无济于事: 对象的生命周期.开始时间:.其初始化(如果有)已完
..
此问题是one 的后续问题 [temp.concept]/5表示: 概念未实例化([temp.spec])。 [ 注意:表示概念专门化的id表达式作为表达式([expr.prim.id])求值。[.]] 因此,命名概念专门化表达式可能因可访问性而具有不同的值。 如果是这样的话,我想知道表达式将在什么上下文中求值: 概念定义的上下文; 表达式的上下文; 表达式
..
是否允许在不存在这样的重载操作符时重载运算符,如operator+用于标准库类型和内置类型的组合? 例如,在默认命名空间或自定义命名空间中实现以下运算符是否合法: std::string operator+(const std::string& s, int right) { ... } 我知道std::命名空间中的实现有各种限制,但我不清楚是否有针对上述限制的规则(这是否是个好主
..
以下代码: struct S { static constexpr int rolling_sum[4]{ 0, rolling_sum[0] + 1, rolling_sum[1] + 2, rolling_sum[2] + 3 }; }; 被clang接受(版本12测试),但被GCC拒绝(版本11测试),
..
为了区分编译器已知值,从而能够在编译时检测错误,使用‘constexpr’参数会很有用。示例: int do_something(constexpr int x) { static_assert(x > 0, "x must be > 0"); return x + 5; } int do_something(int x) { if(x > 0) { cout
..
struct B { B(int) {} B(B const&) {} }; struct D: B { using B::B; }; int main(void) { B b(5); D d(b); // error return 0; } c++14在12.9[class.inhctor]/p3中明确从继承的构造函数中排除复制/移动构造函数。 对于继承的候
..
我知道我可以做到 auto&& bla = something(); 根据something返回值的const程度,我会为bla获取不同的类型。 这是否也适用于结构化绑定的情况,例如 auto&& [bla, blabla] = something(); 我想是的(结构化绑定搭载在auto初始值设定项上,其行为如下),但我找不到明确的“是”。 更新:初步测试似乎达到
..
[dcl.init]/17.6中明确写到,初始化圆括号时,会发生副本省略: 如果初始化器表达式是prvalue,并且源类型的cv非限定版本与目标的类相同,则初始化器表达式用于初始化目标对象。[ 示例:T x=T());调用T默认构造函数初始化x。 - 结束示例 ] 但是在列表初始化的情况下(上面的段落不适用),我没有发现任何类似的东西。请参见[dcl.init.list]。 那么
..
class C { using namespace std; // error }; namespace N { using namespace std; // ok } int main () { using namespace std; // ok } 我想知道它背后的动机。 推荐答案 我不太清楚,但我猜在类范围内允许此操作可能会导致念力: namespac
..
..
我已经看到它多次断言 C++ 标准不允许以下代码: int 数组[5];int *array_begin = &array[0];int *array_end = &array[5]; &array[5] 在这种情况下是合法的 C++ 代码吗? 如果可能的话,我想要一个参考标准的答案. 知道它是否符合 C 标准也很有趣.如果它不是标准 C++,为什么决定将其与 array + 5
..
“未定义行为"的经典杜撰示例;当然是“鼻恶魔".— 物理上不可能,无论 C 和 C++ 标准允许什么. 因为 C 和 C++ 社区倾向于强调未定义行为的不可预测性以及允许编译器在遇到未定义行为时使程序按字面意思执行任何事情的想法,我曾假设该标准对未定义行为的行为没有任何限制. 但是C++ 标准中的相关引用似乎是: [C++14: defns.undefined]: [..] 允许
..
已更新,见下文! 我听说并读到 C++0x 允许编译器为以下代码段打印“Hello" #include int main() {而(1);std::cout
..
..