小编dfr*_*fri的帖子

如何在Swift中的Bools数组中找到许多True语句

我是一个新开发人员,似乎无法弄清楚如何在布尔数组中找到True语句的数量.我知道如何通过索引而不是通过值来查找.任何援助将不胜感激.

let arrayElement = [Bool](repeating: false, count: 10)
var before: [[Bool]] = [[Bool]](repeating: arrayElement, count:10)
for i in 0 ..< 10 {
    for j in 0 ..< 10 {
        if arc4random_uniform(3) == 1 {
            before[i][j] = true  
        }        
    }
}
Run Code Online (Sandbox Code Playgroud)

arrays boolean swift

8
推荐指数
1
解决办法
1975
查看次数

函数模板和缩写函数模板之间的等价性

以下所有标准参考均指2020 年 6 月 22 日生成的当前 ISO 标准工作草案


[dcl.fct]/18指出[摘录,强调我的]:

缩写函数模板是一个函数声明具有一个或多个通用参数类型占位符([dcl.spec.auto])。一个缩写的函数模板等价于一个函数模板([temp.fct]),它的模板参数列表包括一个发明的类型模板参数,用于函数声明的每个泛型参数类型占位符,按出现顺序。[...]

这样,函数声明的以下内容可能是等效的

template <typename T>
void f(T);

void f(auto);  // re-declaration
Run Code Online (Sandbox Code Playgroud)

然而,我们可能会注意到,[dcl.fct]/18的例子表明

[...]

这些声明在功能上与以下声明等效但不等效)。

[...]

这可能(我不确定如何解释)可能与前一段中的等价陈述相冲突。

现在,GCC 10.1.0 和 Clang 10.0.0(以及 GCC:HEAD 和 Clang:HEAD)在这里都有一些混合行为。如果我们声明一个函数模板,然后使用混合经典函数模板语法和缩写函数模板语法定义它(/重新声明它),Clang 接受大多数情况(定义一个先前声明的函数),而 GCC 拒绝所有(见(尝试) ) 重新声明为单独声明的函数,随后在重载解析中出现歧义失败):

// A1: Clang OK, GCC error
template <typename T>
void a(T);

void a(auto) {}

// B1: Clang …
Run Code Online (Sandbox Code Playgroud)

c++ templates language-lawyer c++20

8
推荐指数
1
解决办法
155
查看次数

仅在(互斥的)需要条款中的差异导致隐藏的朋友超载:合法还是违反 ODR?

考虑下面的类模板,它包含同一个朋友(相同的函数类型;见下文)的两个(隐藏)朋友声明,它也定义了朋友(因此朋友是内联的),但定义条件为(互斥)要求条款

#include <iostream>

struct Base {};

template<int N>
struct S : public Base {
    friend int foo(Base&) requires (N == 1) { return 1; }
    friend int foo(Base&) requires (N == 2) { return 3; }
};
Run Code Online (Sandbox Code Playgroud)

[dcl.fct] / 8指出尾随需要子句函数的类型的一部分。重点矿]:

返回类型、参数类型列表、引用限定符、cv-qualifier-seq 和异常规范,但不是默认参数([dcl.fct.default])或尾部的 requires-clause ([ dcl.decl]),是函数类型的一部分

这意味着对于两个定义都被实例化的情况,上述两个定义违反了 ODR;如果我们只关注单个翻译单元,[basic.def.odr]/1将被违反:

任何翻译单元不得包含任何变量、函数、类类型、枚举类型、模板、参数的默认参数(对于给定范围内的函数)或默认模板参数的多个定义。

并且在单个 TU 中,这种违规行为应该可以被诊断出来(不需要“格式错误,NDR”)。我正在尝试了解何时实例化上述定义的规则;或者如果这完全是实现定义的(或者甚至在到达实例化阶段之前格式错误)。

Clang 和 GCC (1) …

c++ templates friend-function language-lawyer c++20

8
推荐指数
1
解决办法
177
查看次数

在 Swift 中使用委托数组时如何避免保留循环

在我的一个类中,我使用了一组委托(该类是一个单例)。这导致了一个保留周期。我知道当我只使用一个委托时,我可以通过使委托变弱来避免保留周期。但这对我的一系列代表不起作用。

我怎样才能避免这种保留周期。

例子:

protocol SomeDelegate: class {
    func someFunction()
}
Run Code Online (Sandbox Code Playgroud)

我的课

class SomeClass {
    // This class is a singleton!
    static let sharedInstance = SomeClass()

    var delegates = [SomeDelegate]()   // this is causing a retain cycle
    weak var delegate: SomeDelegate?   // this is ok.

    ... other code...
}
Run Code Online (Sandbox Code Playgroud)

arrays delegates retain-cycle swift

7
推荐指数
1
解决办法
2614
查看次数

无符号位字段溢出是否保证环绕?

细节

cppreference中位字段引用提供了以下示例:

#include <iostream>
struct S {
 // three-bit unsigned field,
 // allowed values are 0...7
 unsigned int b : 3;
};
int main()
{
    S s = {7};
    ++s.b; // unsigned overflow (guaranteed wrap-around)
    std::cout << s.b << '\n'; // output: 0
}
Run Code Online (Sandbox Code Playgroud)

强调保证环绕评论.

但是,WG21 CWG Issue 1816描述了一些可能的问题,即位字段值的规范不清楚,以及最新标准草案规则中的[expr.post.incr]/1:

后缀++表达式的值是其操作数的值....

如果操作数是不能表示递增值的位字段,则位字段的结果值是实现定义的.

但是,如果这也适用于无符号位域的环绕,我不确定.

  • 无符号位字段溢出是否保证环绕?

c++ integer-overflow language-lawyer bit-fields

7
推荐指数
1
解决办法
221
查看次数

将类型声明为类型模板参数的模板参数的一部分是否合法?

以下所有标准参考均指N4659:2017 年 3 月后 Kona 工作草案/C++17 DIS


以下代码段成功为 Clang 和 GCC 的所有标准版本(1)编译。

template<typename Tag>
struct Tagged {};

Tagged<struct Tag1> t1;
Tagged<struct Tag2> t2;
Run Code Online (Sandbox Code Playgroud)

[temp.arg.type]/1要求

作为类型的模板参数模板参数应为type-id

[temp.arg.type]/2包含注释

[? 注意:模板类型参数可能是不完整的类型 ([basic.types])。?——?尾注?]

因此,我将访问模板参数类型 ID的语法,以了解前者是否也允许声明(不完整的)类类型;换句话说,如果类头可以用作模板参数的一部分;来自[class]/1

class-head:
    class-key attribute-specifier-seq_opt class-head-name class-virt-specifier_opt base-clause_opt
    class-key attribute-specifier-seq_opt base-clause_opt

...

class-key:
  class
  struct
  union
Run Code Online (Sandbox Code Playgroud)

然而,下降为的语法兔子洞一个模板参数一个类型-ID一个ID-表达 …

c++ templates language-lawyer

7
推荐指数
1
解决办法
116
查看次数

std::unordered_map::reserve 是否保证只要映射中的元素较少就不会发生内存分配?

如果我将 std::unordered_map::reserve 与参数 n 一起使用,只要插入到映射中的元素少于 n 个,插入到映射中是否能保证不会导致堆分配?

c++ memory unordered-map std language-lawyer

7
推荐指数
1
解决办法
147
查看次数

无捕获的 lambda 是结构类型吗?

C++20 接受的P1907R1引入了结构类型,这是非类型模板参数的有效类型。

GCC 和 Clang 都接受以下 C++2a 代码片段:

template<auto v>
constexpr auto identity_v = v;

constexpr auto l1 = [](){};
constexpr auto l2 = identity_v<l1>; 
Run Code Online (Sandbox Code Playgroud)

暗示无捕获 lambda 的类型是结构类型。

  • 无捕获 lambda 确实满足其类型成为结构类型的要求吗?

c++ lambda templates language-lawyer c++20

7
推荐指数
2
解决办法
183
查看次数

数组到指针的转换 + rvalue-ref:重载分辨率差异 GCC vs clang

#include <iostream>
#define FUNC() { std::cout << __PRETTY_FUNCTION__ << "\n"; }

void foo(char const*&&   ) FUNC() // A
void foo(char const(&)[4]) FUNC() // B

int main()
{
    foo("bar");
}
Run Code Online (Sandbox Code Playgroud)

演示

当在第一个重载 (A) 的参数类型中使用右值引用时,clang current master 明确地选择重载 A 而不是 B。另一方面,GCC current master 抱怨歧义。

我很惊讶字符串文字是4char const左值[expr.prim.literal]/1 , [lex.string]/6)应该更喜欢重载 A 上的数组到指针转换而不是身份转换过载 B.

如果没有右值引用,即void foo(char const*),GCC 和 clang 都拒绝调用不明确。这也是我不完全理解的事情,因为我会猜测仍然存在数组到指针的转换,因此[over.ics.rank]p3.2.1适用:

  • 标准转换序列 S1 是比标准转换序列 S2 更好的转换序列,如果

    • (3.2.1) S1是S2的真子序列(比较[over.ics.scs]定义的规范形式的转换序列,不包括任何左值转换;恒等转换序列被认为是任何非-身份转换序列),或者,如果不是,

在这两种情况下发生了什么?

c++ language-lawyer overload-resolution implicit-conversion

7
推荐指数
1
解决办法
103
查看次数

在内联函数的定义中使用 constexpr 变量时可能发生 ODR 违规(在 C++14 中)

(注意!这个问题特别涵盖了 C++17 中引入内联变量之前 C++14 的状态)

太长了;问题

  • 什么构成了在内联函数定义中使用 constexpr 变量的 odr 使用,使得该函数的多个定义违反了 [basic.def.odr]/6?

(...可能是 [basic.def.odr]/3;但是一旦在内联函数定义的上下文中获取这样一个 constexpr 变量的地址,这是否可以在程序中默默地引入 UB?)

TLDR 示例:执行一个程序,其doMath()定义如下:

// some_math.h
#pragma once

// Forced by some guideline abhorring literals.
constexpr int kTwo{2};
inline int doMath(int arg) { return std::max(arg, kTwo); }
                                 // std::max(const int&, const int&)
Run Code Online (Sandbox Code Playgroud)

一旦doMath()在两个不同的翻译单元中定义(例如通过包含some_math.h并随后使用doMath()),就会有未定义的行为吗?

背景

考虑以下示例:

// constants.h
#pragma once
constexpr int kFoo{42};

// foo.h
#pragma once
#include "constants.h"
inline int foo(int arg) { return arg * kFoo; …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer c++14

7
推荐指数
1
解决办法
682
查看次数