Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
'file(line_number)'-compiler dwingt mogelijk geen evaluatievolgorde van links naar rechts af voor het aanroepen van operator_name
Opmerkingen
Vanaf C++17 moeten de operanden van de operators ->*, []>> en << worden geëvalueerd in volgorde van links naar rechts. Er zijn twee gevallen waarin de compiler deze volgorde niet kan garanderen:
wanneer een van de operand-expressies een object is dat wordt doorgegeven door een waarde of een object bevat dat wordt doorgegeven door een waarde, of
wanneer deze is gecompileerd met behulp van /clr en een van de operanden een veld van een object of een matrixelement is.
De compiler verzendt waarschuwing C4866 wanneer de evaluatie van links naar rechts niet kan worden gegarandeerd. Deze waarschuwing wordt alleen gegenereerd als /std:c++17 of later is opgegeven, omdat de vereiste van links naar rechts van deze operators is geïntroduceerd in C++17.
Deze waarschuwing is standaard uitgeschakeld; u kunt /Wall of /wN4866 gebruiken om deze in te schakelen op de opdrachtregel als een waarschuwing op niveau N of gebruik #pragma waarschuwing in uw bronbestand. Zie Compiler-waarschuwingen die standaard zijn uitgeschakeld voor meer informatie.
Deze waarschuwing is geïntroduceerd in Visual Studio 2017 versie 15.9 als gevolg van de conformiteit van de compiler voor de C++17-standaard. Code die is gecompileerd zonder waarschuwingen in versies van de compiler voordat Visual Studio 2017 versie 15.9 nu C4866 kan genereren. Zie Compilerwaarschuwingen per compilerversie voor meer informatie over het uitschakelen van waarschuwingen die zijn geïntroduceerd in een bepaalde compilerversie of hoger.
U kunt deze waarschuwing oplossen door eerst na te gaan of de operatorelementen van links naar rechts moeten worden geëvalueerd, bijvoorbeeld wanneer de evaluatie van de elementen orderafhankelijke neveneffecten kan opleveren. In veel gevallen heeft de volgorde waarin elementen worden geëvalueerd geen waarneembaar effect.
Als de volgorde van de evaluatie van links naar rechts moet zijn, kunt u overwegen of u de elementen in plaats daarvan kunt doorgeven aan const een verwijzing. Deze wijziging elimineert de waarschuwing in het volgende codevoorbeeld.
Example
In dit voorbeeld wordt C4866 gegenereerd en ziet u een manier om dit op te lossen:
// C4866.cpp
// compile with: /w14866 /std:c++17
class HasCopyConstructor
{
public:
int x;
HasCopyConstructor(int x) : x(x) {}
HasCopyConstructor(const HasCopyConstructor& h) : x(h.x) { }
};
int operator->*(HasCopyConstructor a, HasCopyConstructor b) { return a.x + b.x; }
// This version of operator->* does not trigger the warning:
// int operator->*(const HasCopyConstructor& a, const HasCopyConstructor& b) { return a.x + b.x; }
int main()
{
HasCopyConstructor a{ 1 };
HasCopyConstructor b{ 2 };
a->*b; // C4866 for call to operator->*
};