在这个site上,它指出传递给std::search
的二元谓词的一个约束是:
类型Type1和Type2必须是类型为ForwardIt1和ForwardIt2的对象可以取消引用,然后隐式转换为Type1和Type2。
但是,在C ++国际标准文档中,我看不到对这种约束的引用。我想知道这个约束是否在C ++国际标准文档中明确说明了它所属的部分。另外,如果不是,那么为什么这个约束放在std::search
函数上,因为有可能有两个不同的类型,虽然不可隐式转换,但是定义了相等运算符的重载?
答案 0 :(得分:6)
这是网站上的一个错误。
该参数说明填充自this template。它不区分仅被称为pred(*first1, *first2)
的二进制谓词与被称为pred(*first1, *first2)
和pred(*first2, *first1)
进一步挖掘:
似乎this edit为parent template's cast req2
使用添加了一个命名参数,该参数控制是“分别”还是“分别”。 eq
变体没有此新参数的直通。我没有编辑权限可以将其添加到模板和std::search
答案 1 :(得分:3)
[algorithms.requirements]/7中列出BinaryPredicate
的要求:
只要算法需要一个函数对象,当应用于取消引用两个相应迭代器的结果或取消引用迭代器并在
BinaryPredicate
是其中时键入T
,就会使用T
参数签名返回值为true
的可测试值。换句话说,如果算法将BinaryPredicate
binary_pred
作为其参数,first1
和first2
作为其迭代器参数,它应该在构造binary_pred(*first1, *first2)
中正常工作上下文转换为bool
([conv])。BinaryPredicate
始终将第一个迭代器value_type
作为其第一个参数,也就是说,在T value
是签名的一部分的情况下,它应该在构造中正常工作{ {1}}上下文转换为binary_pred(*first1, value)
([转化])。bool
不应通过解除引用的迭代器应用任何非常量函数。
无需从解除引用binary_pred
构建Type1
。单词' 两者'在OP的cppreference引用中是不准确的。
答案 2 :(得分:1)
好的,我终于看到了你的困惑。是由“两个”这个词的使用方式引起的。
意思应该是以下两个条件都必须为真:
类型Type1
必须是ForwardIt1
类型的对象
取消引用,然后隐式转换为Type1
类型Type2
必须是ForwardIt2
类型的对象可以取消引用,然后隐式转换为Type2
您将在25.2.13搜索[alg.search]:
中找到要求§25.2.13搜索[alg.search]
template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
- 返回:
醇>i
范围内的第一个迭代器[first1,last1 - (last2-first2))
,使得每个非负整数n
小于last2 - first2
*(i + n) == *(first2 + n)
以下相应条件成立:pred(*(i + n), *(first2 + n)) != false
,first1
。如果[first2, last2)
为空,则返回last1
,否则返回pred(*(i + n), *(first2 + n)) != false
找到了迭代器。
相关的条件是:
pred(*(i + n), *(first2 + n))
这意味着*(i + n)
有效。这意味着*(first2 + n)
和pred
可以作为参数传递给pred。这意味着ForwardIterator1
的第一个参数必须可以通过解除引用pred
来构建,而ForwardIterator2
的第二个参数必须可以通过解除引用function ConvertToUNCPath(AMappedDrive: string) : string;
var
lRemoteString : array[0..255] of char;
lpRemote : PChar;
lStringLen : Cardinal;
begin
lpRemote := @lRemoteString;
lStringLen := 255;
If WNetGetConnection(Pchar(ExtractFileDrive(AMappedDrive)) ,
lpRemote,
lStringLen) = NO_ERROR Then
Result := lRemoteString
else
Result := ''; // No mapping found
end;
function TDataModuleData.OpenGDBDatabase(AGDBName: string) : Boolean;
var
lDlgLogin: TFrmLogin;
p : Integer;
lUNC,
lErrMsg : String;
begin
Result := False;
with FDConnection do // TFDConnection
begin
Close;
TxOptions.Isolation := xiDirtyRead;
p := Pos(':',AGDBName);
if p = 2 then
begin
lUNC := ConvertToUNCPath(Copy(AGDBName,1,2));
if lUNC <> '' then
begin
lUNC := Copy(lUNC,3);
p := pos('\',lUNC);
AGDBName := Copy(lUNC,p) + Copy(AGDBName,3);
lUNC := copy(lUNC,1,p-1);
end;
end;
DriverName := S_FD_IBId;
Params.Database := AGDBName;
if lUNC <> '' then
Params.Add('Server=' + lUNC)
else
Params.Add('Server=localhost'); // Not strictly necessary
Params.UserName := 'SYSDBA';
Params.Password := 'masterkey';
try
Open;
Result := Connected;
except
on E:Exception do
begin
lErrMsg := LowerCase(E.Message);
end;
end;
end;
end;
来构建。