下面的长显式初始化列表是否可以被生成它的某个模板替换?
std::array<Foo, n_foos> foos = {{
{0, bar},
{1, bar},
{2, bar},
{3, bar},
{4, bar},
{5, bar},
{6, bar},
{7, bar},
}};
Run Code Online (Sandbox Code Playgroud)
现在这里的代码只是因为我们有了constexpr int n_foos = 8
.怎么能做到任意和大n_foos
?
我碰巧UIViewControllers
在我的新 iOS Swift 应用程序之一中编写了以下代码片段。
var starButtonsCount = starButtons.count
@IBOutlet var starButtons: [UIButton]!
Run Code Online (Sandbox Code Playgroud)
然后紧挨着starButtonsCount
变量声明后面的错误出现了红色。
错误:无法在属性初始值设定项中使用实例成员“starButtons”;属性初始值设定项在 'self' 可用之前运行。
所以我发现通过声明starButtonCount
变量lazy
我们可以解决这个错误(在 iOS App 开发过程的长期运行中是暂时的)。
我很想知道还有什么其他方法可以解决这个问题?
有没有办法starButtonCount
在starButtons
IBOutlets 初始化时触发初始化?
在最新版本的 gcc(或 clang)中编译此代码时 -std=c17 -pedantic-errors -Wall -Wextra
static const int y = 1;
static int x = y;
Run Code Online (Sandbox Code Playgroud)
然后我没有收到编译器诊断消息,即使我相当确定这不是有效的 C 而是约束违规。我们可以通过查看C17 6.7.9/4来证明它是不符合的:
约束
...
具有静态或线程存储持续时间的对象的初始值设定项中的所有表达式都应为常量表达式或字符串文字。
然后是关于常量表达式的定义,在这种情况下是整数常量表达式(6.6):
整数常量表达式应具有整数类型,并且只能具有整数常量、枚举常量、字符常量、结果为整数常量的 sizeof 表达式、_Alignof 表达式和作为强制转换的直接操作数的浮点常量的操作数。
最后是关于整数常量的定义(6.4.4.1/2):
整数常量以数字开头,但没有句点或指数部分。它可能有一个指定其基础的前缀和一个指定其类型的后缀。
因此,const int
变量不是整数常量,也不是整数常量表达式。因此不是有效的初始化程序。这之前已经讨论过(例如这里),我认为已经确定这是不合格的。但是,我的问题是:
为什么 gcc 即使在严格模式下也选择不合规?
clang 显然一直不合规,但 gcc 从 7.3 版的合规变为 8.0 及更高版本的不合规。即使在没有-pedantic-errors
.
似乎已经对这条消息做出了某种积极的、有意识的决定。为什么在 gcc 中完全删除它,为什么在严格模式下编译时不保留它-std=c17 -pedantic-errors
?
代码:
import SwiftUI
public struct Snackbar<Content>: View where Content: View {
private var content: Content
// Works OK
public init(@ViewBuilder content: () -> Content) {
self.content = content()
}
init(_ text: String) {
self.init {
Text(text) // cannot convert value of type 'Text' to closure result type 'Content'
.font(.subheadline)
.foregroundColor(.white)
.multilineTextAlignment(.leading)
}
}
public var body: some View {
HStack {
VStack(alignment: .leading, spacing: 4) {
content
}
Spacer()
}
.frame(maxWidth: .infinity,
minHeight: 26)
.padding(.fullPadding)
.background(Color.black)
.clipShape(RoundedRectangle(cornerRadius: .defaultCornerRadius))
.shadow(color: Color.black.opacity(0.125), …
Run Code Online (Sandbox Code Playgroud) 我在Objective-C中遇到一个奇怪的问题,当我有两个类使用相同名称的初始化器,但是类型不同的参数.例如,假设我创建了类A和B:
啊:
#import <Cocoa/Cocoa.h>
@interface A : NSObject {
}
- (id)initWithNum:(float)theNum;
@end
Run Code Online (Sandbox Code Playgroud)
上午:
#import "A.h"
@implementation A
- (id)initWithNum:(float)theNum
{
self = [super init];
if (self != nil) {
NSLog(@"A: %f", theNum);
}
return self;
}
@end
Run Code Online (Sandbox Code Playgroud)
BH:
#import <Cocoa/Cocoa.h>
@interface B : NSObject {
}
- (id)initWithNum:(int)theNum;
@end
Run Code Online (Sandbox Code Playgroud)
BM:
#import "B.h"
@implementation B
- (id)initWithNum:(int)theNum
{
self = [super init];
if (self != nil) {
NSLog(@"B: %d", theNum);
}
return self;
}
@end
Run Code Online (Sandbox Code Playgroud)
main.m文件:
#import <Foundation/Foundation.h>
#import "A.h" …
Run Code Online (Sandbox Code Playgroud) 我有一个自定义类,我想表现得像一个内置类型.
但是我注意到你可以在不提供初始值的情况下初始化该类的const变量.我的类目前有一个空的默认构造函数.
这是int和我的类foo的比较:
int a; // Valid
int a = 1; // Valid
const int a = 1; // Valid
const int a; // Error
foo a; // Valid
foo a = 1; // Valid
const foo a = 1; // Valid
const foo a; // Should cause an error, but it compiles
Run Code Online (Sandbox Code Playgroud)
如你所见,我需要预防
const foo a;
Run Code Online (Sandbox Code Playgroud)
从编译.
来自C++大师的任何想法?
我想知道是否有可能得到域名网址即
localhost or myapp.heroku.com
Run Code Online (Sandbox Code Playgroud)
从初始化文件?
我相信
request.url
Run Code Online (Sandbox Code Playgroud)
并且请求方法仅适用于控制器.有没有相当于javascript
document.domain
Run Code Online (Sandbox Code Playgroud)
我可以在初始化文件中做什么?或者我可以用javascript嵌入.rb文件吗?或请求对象的其他替代方案?
香港专业教育学院尝试了许多不起作用的东西
Rails.root
Run Code Online (Sandbox Code Playgroud)
并且我很难解决这个问题.
谢谢=)
我正在尝试在一个快速子类中覆盖此Objective-C方法。我一直收到编译器错误:
从AWSMTLModel
- (instancetype)initWithDictionary:(NSDictionary *)dictionary error:(NSError **)error
Run Code Online (Sandbox Code Playgroud)
斯威夫特子类
override func init!(dictionary dictionaryValue: [NSObject : AnyObject]!)//error: overriding declaration requires override keyword (fix it places override after func but gives same error
Run Code Online (Sandbox Code Playgroud) 这个让我难过.我无法弄清楚为什么Swift抱怨self.init在这段代码中不止一次被调用:
public init(body: String) {
let parser = Gravl.Parser()
if let node = parser.parse(body) {
super.init(document: self, gravlNode: node)
} else {
// Swift complains with the mentioned error on this line (it doesn't matter what "whatever" is):
super.init(document: self, gravlNode: whatever)
}
}
Run Code Online (Sandbox Code Playgroud)
除非我遗漏了某些东西,否则它只会召唤init
一次.有趣的是,如果我评论第二行,Swift抱怨所有路径都没有调用Super.init,哈哈.
我错过了什么?
更新:
好的,所以问题肯定是试图传递self
给super.init的调用.哈,我完全忘了我在做那件事.我想我已经通过实验编写并编译并认为它可能实际工作,但看起来它实际上是一个错误,它根本就是这样编译的.
无论如何,因为传递self
给初始化器是多余的,因为它是同一个对象,我改变了父初始化器接受一个可选的文档参数(它只是一个内部初始化器,所以没什么大不了的),如果是,nil
我只是将它设置self
为父级初始化.
对于那些好奇的人来说,这就是父初始化程序(现在)的样子:
internal init(document: Document?, gravlNode: Gravl.Node) {
self.value = gravlNode.value
super.init()
self.document = document ?? self as! Document
// …
Run Code Online (Sandbox Code Playgroud) 据我所知,引用不能为空,但是当我运行这样的代码时:
#include <iostream>
#include <string>
void test(int i, const std::string& s = nullptr) {
std::cout << i << " " << s << std::endl;
}
int main() {
test(1, "test");
test(2);
}
Run Code Online (Sandbox Code Playgroud)
可选参数s
可以为null,并生成代码。此外,test(2)
运行时,程序将引发异常,而不是打印一些随机字符串。
当我更改s
为int之类的基本类型时,它无法编译,因此我认为魔术仍然保留在字符串类中,但是如何?
而且,如何检查是否s
为null?如果我使用if(s==nullptr)
或if(s.empty())
,它将无法编译。
initializer ×10
swift ×4
c++ ×3
ios ×2
c ×1
c++11 ×1
const ×1
domain-name ×1
gcc ×1
iboutlet ×1
nullptr ×1
objective-c ×1
overriding ×1
reference ×1
selector ×1
stdstring ×1
swift3 ×1
swiftui ×1
templates ×1
viewbuilder ×1