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

标签 delphi generics inline-code compiler-bug

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

相关文章:

java - <T>(尖括号)在 Java 中意味着什么?

c# - 有没有比 <%= %> 更好、更简单的内联提取文本的方法?

javascript - 内联 PHP 停止使用 if 函数和 javascript

javascript - 这是多么糟糕 - 使用外部处理程序定义的内联 js 调用 VS 完全外部 js

delphi - 如何在Delphi中创建声音笔记?

java - 处理通用键的哈希函数

java - 泛型类方法调用

带有 Ssl 连接超时 10060 的 Delphi XE7 Indy Rest Api 帖子

delphi - Delphi 中组件的定位提示

delphi - 印地 HTTP : reading response content on a 403