我是一个新开发人员,似乎无法弄清楚如何在布尔数组中找到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) 以下所有标准参考均指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) 考虑下面的类模板,它包含同一个朋友(相同的函数类型;见下文)的两个(隐藏)朋友声明,它也定义了朋友(因此朋友是内联的),但定义条件为(互斥)要求条款:
#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) …
在我的一个类中,我使用了一组委托(该类是一个单例)。这导致了一个保留周期。我知道当我只使用一个委托时,我可以通过使委托变弱来避免保留周期。但这对我的一系列代表不起作用。
我怎样才能避免这种保留周期。
例子:
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) cppreference中位字段的引用提供了以下示例:
Run Code Online (Sandbox Code Playgroud)#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 }
强调保证环绕评论.
但是,WG21 CWG Issue 1816描述了一些可能的问题,即位字段值的规范不清楚,以及最新标准草案规则中的[expr.post.incr]/1:
后缀++表达式的值是其操作数的值....
如果操作数是不能表示递增值的位字段,则位字段的结果值是实现定义的.
但是,如果这也适用于无符号位域的环绕,我不确定.
以下所有标准参考均指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)
作为类型的模板参数的模板参数应为type-id。
和[temp.arg.type]/2包含注释
[? 注意:模板类型参数可能是不完整的类型 ([basic.types])。?——?尾注?]
因此,我将访问模板参数和类型 ID的语法,以了解前者是否也允许声明(不完整的)类类型;换句话说,如果类头可以用作模板参数的一部分;来自[class]/1:
Run Code Online (Sandbox Code Playgroud)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
如果我将 std::unordered_map::reserve 与参数 n 一起使用,只要插入到映射中的元素少于 n 个,插入到映射中是否能保证不会导致堆分配?
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 的类型是结构类型。
#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++17 中引入内联变量之前 C++14 的状态)
(...可能是 [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)