使用该函数时,编译器会为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/