小编zhi*_*ang的帖子

为什么C++允许将std :: initializer_list强制转换为原始类型,并用于初始化它们?

这个问题与std :: initializer_list有关,以及为什么允许初始化基本类型.考虑以下两个功能:

void foo(std::string arg1, bool arg2 = false);
void foo(std::string arg1, std::deque<std::string> arg2, bool arg3 = false);
Run Code Online (Sandbox Code Playgroud)

为什么在这样调用foo时:

foo("some string", { });
Run Code Online (Sandbox Code Playgroud)

选择第一个重载,而不是第二个?好吧,实际上不是为什么它被选中,这是因为{ }可以用来初始化任何东西,包括原始类型.我的问题是这背后的原因.

std :: initializer_list采用{ args... },因此在编译时不能具有不确定的长度.试图这样做bool b = { true, true }给人error: scalar object 'b' requires one element in initialiser.

尽管允许统一初始化似乎是一个好主意,但事实是这是令人困惑且完全出乎意料的行为.确实,编译器如何才能做到这一点,在后台做一些魔术没有做std :: initializer_list的事情?

除非{ args... }是C++词法结构,否则我的观点仍然存在:为什么它允许用于原始类型的初始化?

谢谢.在意识到错误的重载被调用之前,我在这里遇到了很多错误.用了10分钟搞清楚原因.

c++ initializer-list c++11

9
推荐指数
1
解决办法
714
查看次数

链接时LLVM IR类型被错误地折叠(C++ API)

直截了当 - 我正在尝试将两个(或更多)llvm模块链接在一起,而我正面临来自LLVM的某个奇怪错误.

我不想发布太多代码,所以我会在这里使用一堆伪.

我有3个模块,比方说A,B和C. A是主要模块; 我llvm::Linker用它初始化.B和C是辅助模块; 我打电话linker.linkInModule(B and C).

除其他外,所有3个模块都定义了以下两种类型:

%String = type { i8*, i64 }
%Character = type { i8*, i64 }
Run Code Online (Sandbox Code Playgroud)

请注意,它们具有相同的成员类型.此外,函数foo定义为(在模块B中):

define i1 @_ZN9Character7hasDataEv(%Character*) { }
Run Code Online (Sandbox Code Playgroud)

这个函数在模块A和C中声明.现在,一切看起来都很好 - 从模块A和C调用此函数,并且IR看起来很正常,如下所示:

%21 = call i1 @_ZN9Character7hasDataEv(%Character* %4)
Run Code Online (Sandbox Code Playgroud)

问题出在这里:当所有3个模块链接在一起时,这些类型会发生一些事情:

  1. 他们失去了名字,成为%2(%String)和%3(%Character).
  2. 它们似乎合并在一起.

奇怪的是,虽然这种转换发生在模块A和C中,但这种错误只发生在C中 - 注意A是所谓的"主"模块.

现在是链接文件的函数定义

define i1 @_ZN9Character7hasDataEv(%2*)
Run Code Online (Sandbox Code Playgroud)

注意如何%Character,或者%3,变成了%2.此外,在呼叫网站,可能是尝试取消合并类型,我得到了这个:

%10 = call i1 bitcast (i1 (%2*)* @_ZN9Character7hasDataEv to …
Run Code Online (Sandbox Code Playgroud)

c++ llvm llvm-ir llvm-c++-api

5
推荐指数
1
解决办法
163
查看次数

不透明度上的 SwiftUI 文本动画不起作用

问题很简单:我到底如何Text才能正确地设置动画?

struct ContentView: View {
    @State var foozle: String = ""

    var body: some View {
        VStack() {
            Spacer()

            Text(self.foozle)
                .frame(maxWidth: .infinity)
                .transition(.opacity)

            Button(action: {
                withAnimation(.easeInOut(duration: 2)) {
                    self.foozle = "uuuuuuuuu"
                }
            }) { Text("ugh") }

            Spacer()
        }.frame(width: 320, height: 240)
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:视图坚持做一些愚蠢的动画,其中文本被新文本替换,但被省略号截断,它慢慢地横向扩展,直到显示整个新文本。

当然,这不是关于不透明度的动画。这不是框架宽度问题,因为我已经通过绘制边框进行了验证。

这只是 SwiftUI 中我将不得不处理的另一个愚蠢的错误,并祈祷有人修复它吗?

编辑:好的,感谢@Mac3n,我得到了这个灵感,它可以正常工作,即使它有点难看:

Text(self.foozle)
    .frame(maxWidth: .infinity)
    .opacity(op)

Button(action: {
    withAnimation(.easeOut(duration: 0.3)) {
        self.op = 0

        DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
            self.foozle += "omo"

            withAnimation(.easeIn(duration: 0.3)) {
                self.op = 1
            } …
Run Code Online (Sandbox Code Playgroud)

macos cocoa swift swiftui

5
推荐指数
3
解决办法
4325
查看次数

标签 统计

c++ ×2

c++11 ×1

cocoa ×1

initializer-list ×1

llvm ×1

llvm-c++-api ×1

llvm-ir ×1

macos ×1

swift ×1

swiftui ×1