gpt4 book ai didi

delphi - 为shortstring声明泛型内联函数const是用户错误,还是编译器错误?

转载 作者:行者123 更新时间:2023-12-03 18:40:45 25 4
gpt4 key购买 nike

使用该函数时,编译器会为shortstring生成错误代码

function TTestObject<T>.Compare(const Left, Right: T): integer; inline;

修改参数。

下面的示例程序演示了该概念:

program ShortStringsAndConst;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils;

type
TStr100 = string[100];

TTestObject<T> = class
private
Bag1, Bag2: T;
procedure RandomBags;
procedure TestCompare;
function CompareFail(const Left, Right: T): integer; inline;
function CompareWin(const [ref] Left, Right: T): integer; inline;
end;

var
TestStr100: TTestObject<TStr100>;

procedure Test;
begin
TestStr100:= TTestObject<TStr100>.Create;
TestStr100.RandomBags;
TestStr100.TestCompare;
end;

{ TTestObject<T> }

procedure TTestObject<T>.RandomBags;
var
a: integer;
begin
PByteArray(@Bag1)^[0]:= SizeOf(T)- 1;
for a:= 1 to SizeOf(T)- 1 do begin
PByteArray(@Bag1)^[a]:= byte('a');
end;
Bag2:= Bag1;
end;

function TTestObject<T>.CompareFail(const Left, Right: T): integer;
var
L,R: shortstring;
begin
L:= PShortstring(@Left)^;
R:= PShortstring(@Right)^;
WriteLn(Format('Fail!! @Left = %p, @Right = %p, Left = %s, Right = %s',[@Left, @Right, L, R]));
end;

function TTestObject<T>.CompareWin(const [ref] Left, Right: T): integer;
var
L,R: shortstring;
begin
L:= PShortstring(@Left)^;
R:= PShortstring(@Right)^;
WriteLn(Format('Win: @Left = %p, @Right = %p, Left = %s, Right = %s',[@Left, @Right, L, R]));
end;

procedure TTestObject<T>.TestCompare;
begin
CompareFail(Bag1,Bag2);
WriteLn;
CompareWin(Bag1,Bag2);
ReadLn;
end;

begin
Test;
end.



假设我可以在泛型函数中使用普通的 const逃避这是我的错误,还是这是编译器错误?

奖金问题
除了Shortstring,还有其他类型导致 CompareFail生成无效代码吗?

背景
我不太需要使用 shortstring,但是我正在编写一些通用库代码,并且需要支持所有类型。

更新资料
这是柏林10.1中已修复的编译器错误。

最佳答案

假设我可以在通用函数中使用普通const逃避是我的错误,还是这是编译器错误?


假设您说的是正确的,那么这是一个编译器错误。您需要报告该错误并阻止使用短字符串。

关于delphi - 为shortstring声明泛型内联函数const是用户错误,还是编译器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31102217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com