Ich schreibe einen LLVM-Pass, der Funktionen unter anderem umbenennt. Ich habe dieses kleine Stück CodeWarum verursacht dieser Typalias einen Kompilierungsfehler (C++)?
// Get function arguments
std::vector<Argument*> Arguments;
for (auto Arg = F.arg_begin(); Arg != F.arg_end(); ++Arg)
{
Type *ArgTy = Arg->getType();
if (ArgTy->isFloatingPointTy())
{
errs() << "Cannot test function: " << F.getName() << " (floating point arguments)\n";
return false;
}
Arguments.push_back(Arg);
}
Die Linie Arguments.push_back(Arg)
einen Übersetzungsfehler verursacht:
no known conversion for argument 1 from ‘llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Argument, false, false, void>, false, false>’ to ‘llvm::Argument* const&’
.
jedoch in der Header-Datei llvm/IR/Function.h
(source), arg_iterator
als Alias für den Typen deklariert wird Argument *
, und die Funktionen arg_begin()
und arg_end()
durch eine Function
Instanz aufgerufen, gibt einen arg_iterator()
Typen. Warum bekomme ich den Typfehler? Hat es etwas mit der Verwendung des Schlüsselwortes auto
zu tun?
Sie * können * Iteratoren verwenden? Was bekommen Sie, wenn Sie zB einen Iterator * dereferenzieren? –
@Someprogrammerdude Wenn der Iterator vom Typ 'Argument *' ist, erhalten Sie das spitze 'Argument' als Lvalue. Aber die Frage ist, warum der Typ von 'auto Arg = F.arg_begin() 'nicht' arg_iterator' (== 'Argument *') ist, wie im Header deklariert, sondern etwas anderes. UnchartedWaters: Erstelle ein [mcve]. Ihr Beispiel ist unvollständig. – user2079303