namespace // anonyme
{
int a; // a1
}
int a; // a2
Pour désigner a2, on utilise ::a. Mais peut-on désigner a1 ?
est-ce que le code suivant est légal ?
int * i = new int[ 100 ];
char * c = reinterpret_cast<char*>( i );
delete [] c;
namespace // anonyme
{
int a; // a1
}
int a; // a2
Pour désigner a2, on utilise ::a. Mais peut-on désigner a1 ?
est-ce que le code suivant est légal ?
int * i = new int[ 100 ];
char * c = reinterpret_cast<char*>( i );
delete [] c;
namespace // anonyme
{
int a; // a1
}
int a; // a2
Pour désigner a2, on utilise ::a. Mais peut-on désigner a1 ?
est-ce que le code suivant est légal ?
int * i = new int[ 100 ];
char * c = reinterpret_cast<char*>( i );
delete [] c;
Aurélien REGAT-BARREL wrote:namespace // anonyme
{
int a; // a1
}
int a; // a2
Pour désigner a2, on utilise ::a. Mais peut-on désigner a1 ?
Le namespace anonyme est équivalent à
namespace NomUniqueAuquelOnNAPasDAcces
{
int a;
}
using namespace NomUniqueAuquelOnNAPasDAcces;
il faudrait donc écrire "NomUniqueAuquelOnNAPasDAcces::a" pour
résoudre
l'ambiguïté mais malheureusement on ne connaît pas
"NomUniqueAuquelOnNAPasDAcces"...
est-ce que le code suivant est légal ?
int * i = new int[ 100 ];
char * c = reinterpret_cast<char*>( i );
delete [] c;
Non, voir § 5.3.5/3 :
"[...] In the second alternative (delete array) if the
dynamic type of the object to be deleted differs from
its static type, the behavior is undefined."
Falk
Aurélien REGAT-BARREL wrote:
namespace // anonyme
{
int a; // a1
}
int a; // a2
Pour désigner a2, on utilise ::a. Mais peut-on désigner a1 ?
Le namespace anonyme est équivalent à
namespace NomUniqueAuquelOnNAPasDAcces
{
int a;
}
using namespace NomUniqueAuquelOnNAPasDAcces;
il faudrait donc écrire "NomUniqueAuquelOnNAPasDAcces::a" pour
résoudre
l'ambiguïté mais malheureusement on ne connaît pas
"NomUniqueAuquelOnNAPasDAcces"...
est-ce que le code suivant est légal ?
int * i = new int[ 100 ];
char * c = reinterpret_cast<char*>( i );
delete [] c;
Non, voir § 5.3.5/3 :
"[...] In the second alternative (delete array) if the
dynamic type of the object to be deleted differs from
its static type, the behavior is undefined."
Falk
Aurélien REGAT-BARREL wrote:namespace // anonyme
{
int a; // a1
}
int a; // a2
Pour désigner a2, on utilise ::a. Mais peut-on désigner a1 ?
Le namespace anonyme est équivalent à
namespace NomUniqueAuquelOnNAPasDAcces
{
int a;
}
using namespace NomUniqueAuquelOnNAPasDAcces;
il faudrait donc écrire "NomUniqueAuquelOnNAPasDAcces::a" pour
résoudre
l'ambiguïté mais malheureusement on ne connaît pas
"NomUniqueAuquelOnNAPasDAcces"...
est-ce que le code suivant est légal ?
int * i = new int[ 100 ];
char * c = reinterpret_cast<char*>( i );
delete [] c;
Non, voir § 5.3.5/3 :
"[...] In the second alternative (delete array) if the
dynamic type of the object to be deleted differs from
its static type, the behavior is undefined."
Falk
Bon allez, une dernière pour la route:
class A
{
private:
typedef int MonType1; // types privés
class MonType2 {};
public:
void Test1( MonType1 );
void Test2( MonType2 * );
};
A a;
a.Test1( 0 );
a.Test2( 0 );
je suis étonné que ça marche, vu que dans la définition d'une fonction
publique j'utilise un type privé. Pour le typedef je pense qu'il y a une
histoire d'alias, mais pour Test2, j'ai un cast implicite en MonType2 *
qui
est fait, hors je n'ai pas le droit d'utiliser MonType2.
surtout que je découvre une nuance entre le bon vieux cast C qui est
interdit (?) et static_cast / reinterpret_cast (!) qui sont eux autorisés:
a.Test2( static_cast<A::MyType *>( 0 ) ); // OK
a.Test2( reinterpret_cast<A::MyType *>( 10 ) ); // OK
a.Test2( (A::MyType *)( 0 ) ); // ERREUR
Pourquoi le cast C++ est-il autorisé ?
Bon allez, une dernière pour la route:
class A
{
private:
typedef int MonType1; // types privés
class MonType2 {};
public:
void Test1( MonType1 );
void Test2( MonType2 * );
};
A a;
a.Test1( 0 );
a.Test2( 0 );
je suis étonné que ça marche, vu que dans la définition d'une fonction
publique j'utilise un type privé. Pour le typedef je pense qu'il y a une
histoire d'alias, mais pour Test2, j'ai un cast implicite en MonType2 *
qui
est fait, hors je n'ai pas le droit d'utiliser MonType2.
surtout que je découvre une nuance entre le bon vieux cast C qui est
interdit (?) et static_cast / reinterpret_cast (!) qui sont eux autorisés:
a.Test2( static_cast<A::MyType *>( 0 ) ); // OK
a.Test2( reinterpret_cast<A::MyType *>( 10 ) ); // OK
a.Test2( (A::MyType *)( 0 ) ); // ERREUR
Pourquoi le cast C++ est-il autorisé ?
Bon allez, une dernière pour la route:
class A
{
private:
typedef int MonType1; // types privés
class MonType2 {};
public:
void Test1( MonType1 );
void Test2( MonType2 * );
};
A a;
a.Test1( 0 );
a.Test2( 0 );
je suis étonné que ça marche, vu que dans la définition d'une fonction
publique j'utilise un type privé. Pour le typedef je pense qu'il y a une
histoire d'alias, mais pour Test2, j'ai un cast implicite en MonType2 *
qui
est fait, hors je n'ai pas le droit d'utiliser MonType2.
surtout que je découvre une nuance entre le bon vieux cast C qui est
interdit (?) et static_cast / reinterpret_cast (!) qui sont eux autorisés:
a.Test2( static_cast<A::MyType *>( 0 ) ); // OK
a.Test2( reinterpret_cast<A::MyType *>( 10 ) ); // OK
a.Test2( (A::MyType *)( 0 ) ); // ERREUR
Pourquoi le cast C++ est-il autorisé ?
Je m'en doutais, mais, _apparement_, ça pose pas de problème dans le test
que j'ai fait, ça m'a surpris.
Je m'en doutais, mais, _apparement_, ça pose pas de problème dans le test
que j'ai fait, ça m'a surpris.
Je m'en doutais, mais, _apparement_, ça pose pas de problème dans le test
que j'ai fait, ça m'a surpris.
class A
{
private:
typedef int MonType1; // types privés
class MonType2 {};
public:
void Test1( MonType1 );
void Test2( MonType2 * );
};
A a;
a.Test1( 0 );
a.Test2( 0 );
je suis étonné que ça marche, vu que dans la définition d'une fonction
publique j'utilise un type privé.
surtout que je découvre une nuance entre le bon vieux cast C
qui est interdit (?)
et static_cast / reinterpret_cast (!)
qui sont eux autorisés:
a.Test2( static_cast<A::MyType *>( 0 ) ); // OK
a.Test2( reinterpret_cast<A::MyType *>( 10 ) ); // OK
a.Test2( (A::MyType *)( 0 ) ); // ERREUR
Pourquoi le cast C++ est-il autorisé ?
class A
{
private:
typedef int MonType1; // types privés
class MonType2 {};
public:
void Test1( MonType1 );
void Test2( MonType2 * );
};
A a;
a.Test1( 0 );
a.Test2( 0 );
je suis étonné que ça marche, vu que dans la définition d'une fonction
publique j'utilise un type privé.
surtout que je découvre une nuance entre le bon vieux cast C
qui est interdit (?)
et static_cast / reinterpret_cast (!)
qui sont eux autorisés:
a.Test2( static_cast<A::MyType *>( 0 ) ); // OK
a.Test2( reinterpret_cast<A::MyType *>( 10 ) ); // OK
a.Test2( (A::MyType *)( 0 ) ); // ERREUR
Pourquoi le cast C++ est-il autorisé ?
class A
{
private:
typedef int MonType1; // types privés
class MonType2 {};
public:
void Test1( MonType1 );
void Test2( MonType2 * );
};
A a;
a.Test1( 0 );
a.Test2( 0 );
je suis étonné que ça marche, vu que dans la définition d'une fonction
publique j'utilise un type privé.
surtout que je découvre une nuance entre le bon vieux cast C
qui est interdit (?)
et static_cast / reinterpret_cast (!)
qui sont eux autorisés:
a.Test2( static_cast<A::MyType *>( 0 ) ); // OK
a.Test2( reinterpret_cast<A::MyType *>( 10 ) ); // OK
a.Test2( (A::MyType *)( 0 ) ); // ERREUR
Pourquoi le cast C++ est-il autorisé ?
On Mon, 4 Apr 2005 18:55:48 +0200, "Aurélien REGAT-BARREL"Je m'en doutais, mais, _apparement_, ça pose pas de problème dans le test
que j'ai fait, ça m'a surpris.
Ben oui, c'est un comportement indéfini : ça peut très bien marcher
pendant des mois, puis, au moment où tu fais une modification dans un
tout autre module, BOUM !
On Mon, 4 Apr 2005 18:55:48 +0200, "Aurélien REGAT-BARREL"
Je m'en doutais, mais, _apparement_, ça pose pas de problème dans le test
que j'ai fait, ça m'a surpris.
Ben oui, c'est un comportement indéfini : ça peut très bien marcher
pendant des mois, puis, au moment où tu fais une modification dans un
tout autre module, BOUM !
On Mon, 4 Apr 2005 18:55:48 +0200, "Aurélien REGAT-BARREL"Je m'en doutais, mais, _apparement_, ça pose pas de problème dans le test
que j'ai fait, ça m'a surpris.
Ben oui, c'est un comportement indéfini : ça peut très bien marcher
pendant des mois, puis, au moment où tu fais une modification dans un
tout autre module, BOUM !
ou parce qu'on compile
une nuit de pleine lune, ou ...
ou parce qu'on compile
une nuit de pleine lune, ou ...
ou parce qu'on compile
une nuit de pleine lune, ou ...
"Aurélien REGAT-BARREL" écrivait:qui sont eux autorisés:
a.Test2( static_cast<A::MyType *>( 0 ) ); // OK
a.Test2( reinterpret_cast<A::MyType *>( 10 ) ); // OK
a.Test2( (A::MyType *)( 0 ) ); // ERREUR
Pourquoi le cast C++ est-il autorisé ?
Pour pouvoir t'aider il faudrait savoir ce qu'est MyType et d'où vient
ce fragment de code (fonction membre ou non). Quelle est l'erreur ?
"Aurélien REGAT-BARREL" <nospam-aregatba@yahoo.fr.invalid> écrivait:
qui sont eux autorisés:
a.Test2( static_cast<A::MyType *>( 0 ) ); // OK
a.Test2( reinterpret_cast<A::MyType *>( 10 ) ); // OK
a.Test2( (A::MyType *)( 0 ) ); // ERREUR
Pourquoi le cast C++ est-il autorisé ?
Pour pouvoir t'aider il faudrait savoir ce qu'est MyType et d'où vient
ce fragment de code (fonction membre ou non). Quelle est l'erreur ?
"Aurélien REGAT-BARREL" écrivait:qui sont eux autorisés:
a.Test2( static_cast<A::MyType *>( 0 ) ); // OK
a.Test2( reinterpret_cast<A::MyType *>( 10 ) ); // OK
a.Test2( (A::MyType *)( 0 ) ); // ERREUR
Pourquoi le cast C++ est-il autorisé ?
Pour pouvoir t'aider il faudrait savoir ce qu'est MyType et d'où vient
ce fragment de code (fonction membre ou non). Quelle est l'erreur ?
On Tue, 05 Apr 2005 00:11:51 +0200, Falk Tannhäuser
:ou parce qu'on compile
une nuit de pleine lune, ou ...
Évite de compiler les nuits de pleine lune, ou alors, assure-toi
d'avoir une gousse d'ail à portée de la main.
On Tue, 05 Apr 2005 00:11:51 +0200, Falk Tannhäuser
<tannhauser86549spam@free.fr>:
ou parce qu'on compile
une nuit de pleine lune, ou ...
Évite de compiler les nuits de pleine lune, ou alors, assure-toi
d'avoir une gousse d'ail à portée de la main.
On Tue, 05 Apr 2005 00:11:51 +0200, Falk Tannhäuser
:ou parce qu'on compile
une nuit de pleine lune, ou ...
Évite de compiler les nuits de pleine lune, ou alors, assure-toi
d'avoir une gousse d'ail à portée de la main.
Falk Tannhäuser wrote:Aurélien REGAT-BARREL wrote:est-ce que le code suivant est légal ?
int * i = new int[ 100 ];
char * c = reinterpret_cast<char*>( i );
delete [] c;
Non, voir § 5.3.5/3 :
"[...] In the second alternative (delete array) if the
dynamic type of the object to be deleted differs from
its static type, the behavior is undefined."
Je m'en doutais, mais, _apparement_, ça pose pas de problème
dans le test que j'ai fait, ça m'a surpris.
Bon allez, une dernière pour la route:
class A
{
private:
typedef int MonType1; // types privés
class MonType2 {};
public:
void Test1( MonType1 );
void Test2( MonType2 * );
};
A a;
a.Test1( 0 );
a.Test2( 0 );
je suis étonné que ça marche, vu que dans la définition d'une
fonction publique j'utilise un type privé.
Pour le typedef je pense qu'il y a une histoire d'alias,
mais pour Test2, j'ai un cast implicite en MonType2 * qui est
fait, hors je n'ai pas le droit d'utiliser MonType2.
surtout que je découvre une nuance entre le bon vieux cast C
qui est interdit (?) et static_cast / reinterpret_cast (!) qui
sont eux autorisés:
a.Test2( static_cast<A::MyType *>( 0 ) ); // OK
a.Test2( reinterpret_cast<A::MyType *>( 10 ) ); // OK
a.Test2( (A::MyType *)( 0 ) ); // ERREUR
Pourquoi le cast C++ est-il autorisé ?
Falk Tannhäuser wrote:
Aurélien REGAT-BARREL wrote:
est-ce que le code suivant est légal ?
int * i = new int[ 100 ];
char * c = reinterpret_cast<char*>( i );
delete [] c;
Non, voir § 5.3.5/3 :
"[...] In the second alternative (delete array) if the
dynamic type of the object to be deleted differs from
its static type, the behavior is undefined."
Je m'en doutais, mais, _apparement_, ça pose pas de problème
dans le test que j'ai fait, ça m'a surpris.
Bon allez, une dernière pour la route:
class A
{
private:
typedef int MonType1; // types privés
class MonType2 {};
public:
void Test1( MonType1 );
void Test2( MonType2 * );
};
A a;
a.Test1( 0 );
a.Test2( 0 );
je suis étonné que ça marche, vu que dans la définition d'une
fonction publique j'utilise un type privé.
Pour le typedef je pense qu'il y a une histoire d'alias,
mais pour Test2, j'ai un cast implicite en MonType2 * qui est
fait, hors je n'ai pas le droit d'utiliser MonType2.
surtout que je découvre une nuance entre le bon vieux cast C
qui est interdit (?) et static_cast / reinterpret_cast (!) qui
sont eux autorisés:
a.Test2( static_cast<A::MyType *>( 0 ) ); // OK
a.Test2( reinterpret_cast<A::MyType *>( 10 ) ); // OK
a.Test2( (A::MyType *)( 0 ) ); // ERREUR
Pourquoi le cast C++ est-il autorisé ?
Falk Tannhäuser wrote:Aurélien REGAT-BARREL wrote:est-ce que le code suivant est légal ?
int * i = new int[ 100 ];
char * c = reinterpret_cast<char*>( i );
delete [] c;
Non, voir § 5.3.5/3 :
"[...] In the second alternative (delete array) if the
dynamic type of the object to be deleted differs from
its static type, the behavior is undefined."
Je m'en doutais, mais, _apparement_, ça pose pas de problème
dans le test que j'ai fait, ça m'a surpris.
Bon allez, une dernière pour la route:
class A
{
private:
typedef int MonType1; // types privés
class MonType2 {};
public:
void Test1( MonType1 );
void Test2( MonType2 * );
};
A a;
a.Test1( 0 );
a.Test2( 0 );
je suis étonné que ça marche, vu que dans la définition d'une
fonction publique j'utilise un type privé.
Pour le typedef je pense qu'il y a une histoire d'alias,
mais pour Test2, j'ai un cast implicite en MonType2 * qui est
fait, hors je n'ai pas le droit d'utiliser MonType2.
surtout que je découvre une nuance entre le bon vieux cast C
qui est interdit (?) et static_cast / reinterpret_cast (!) qui
sont eux autorisés:
a.Test2( static_cast<A::MyType *>( 0 ) ); // OK
a.Test2( reinterpret_cast<A::MyType *>( 10 ) ); // OK
a.Test2( (A::MyType *)( 0 ) ); // ERREUR
Pourquoi le cast C++ est-il autorisé ?