Bonjour/Bonsoir,

nous avons dernièrement rencontré un phénomène "intéressant" du language C++ qui nous a causé par mal de bug.

Le problème est illustré avec le code suivant :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
 
class SomeClass {
 
public:
    // Quelques constructeurs...
    SomeClass(int, int, int) { std::cout << "3 int" << std::endl; }
    SomeClass(int, int) { std::cout << "2 int" << std::endl; } 
    SomeClass(int) { std::cout << "1 int" << std::endl; }
};
 
// Et une petite fonction.
void foo(SomeClass) { std::cout << "bar" << std::endl; }
 
int main (int argc, const char * argv[])
{
                                // Affichage :
    SomeClass o3(0, 0, 0);      // 3 int
    SomeClass o2(0, 0);         // 2 int
    SomeClass o1(0);            // 1 int
 
    SomeClass p3 = (0, 0, 0);   // 1 int
    //              ^ expression result unused
 
    foo((0, 0));                // 1 int \n bar
    //   ^ expression result unused
    return 0;
}
Les 'expression result unused' sont donnés par le compilateur avec les bonnes options de compilation pour les warnings.

Je me demandais si l'un d'entre vous saurais m'indiquer quelle section de la norme explique ce comportement.

Merci d'avance à vous pour assouvir ma curiosité! :-)