Package: g++-4.0 Version: 4.0.2-5 Severity: normal Hi,
Given the following (stripped down) code as variant.cpp: #include <iostream> using std::cout; using std::endl; struct Variant { Variant() {} template< typename T > Variant( T ) {} Variant( const Variant& ) {} Variant &operator=( const Variant& ) { return *this; } template< typename T > operator T() const { cout << "operator T() called" << endl; return T(); } template< typename T > operator const T&() const { static T test_dummy; cout << "operator T&() called with T = Variant, uh oh" << endl; return test_dummy; } #ifdef WITH_WARNING operator Variant() const { cout << "operator Variant() called" << endl; return *this; } operator const Variant&() const { cout << "but operator Variant&() _is_ called" << endl; return *this; } #endif }; Variant TempMaker( Variant v ) { return v; } int main() { Variant v = TempMaker( 1 ); return 0; } The following may be observed: $ make variant "CPPFLAGS=-Wconversion -DWITH_WARNING" g++ -Wconversion -DWITH_WARNING variant.cpp -o variant variant.cpp:39: warning: conversion to the same type will never use a type conversion operator variant.cpp:44: warning: conversion to a reference to the same type will never use a type conversion operator $ ./variant but operator Variant&() _is_ called $ make variant CPPFLAGS=-Wconversion g++ -Wconversion variant.cpp -o variant $ ./variant operator T&() called with T = Variant, uh oh Indicating that the explicit operators are in fact called, despite the warning, and are in fact necessary to avoid the compiler attempting to use the template conversion operator with T = Variant(&) (and doing bad recursive things in less stripped code) when temporaries are created for the function call. The simple answer to me is get rid of the warning, the code operates intuitively correctly now, but things are rarely simple... cheers, Ron -- System Information: Debian Release: testing/unstable APT prefers unstable APT policy: (500, 'unstable') Architecture: i386 (i686) Shell: /bin/sh linked to /bin/bash Kernel: Linux 2.6.12 Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968) Versions of packages g++-4.0 depends on: ii gcc-4.0 4.0.2-5 The GNU C compiler ii gcc-4.0-base 4.0.2-5 The GNU Compiler Collection (base ii libc6 2.3.5-9 GNU C Library: Shared libraries an ii libstdc++6-4.0-dev 4.0.2-5 The GNU Standard C++ Library v3 (d g++-4.0 recommends no packages. -- no debconf information -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]